Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1184,6 +1184,20 @@ // Emit the directives as assignments aka .set: OutStreamer->EmitAssignment(Name, lowerConstant(Alias.getAliasee())); + + // If the aliasee does not correspond to a symbol in the output, i.e. the + // alias is not of an object or the aliased object is private, then set the + // size of the alias symbol from the type of the alias. We don't do this in + // other situations as the alias and aliasee having differing types but same + // size may be intentional. + const GlobalObject *BaseObject = Alias.getBaseObject(); + if (MAI->hasDotTypeDotSizeDirective() && Alias.getValueType()->isSized() && + (!BaseObject || BaseObject->hasPrivateLinkage())) { + const DataLayout &DL = M.getDataLayout(); + uint64_t Size = DL.getTypeAllocSize(Alias.getValueType()); + OutStreamer->emitELFSize(cast(Name), + MCConstantExpr::create(Size, OutContext)); + } } GCModuleInfo *MI = getAnalysisIfAvailable(); Index: test/CodeGen/AArch64/global-merge-2.ll =================================================================== --- test/CodeGen/AArch64/global-merge-2.ll +++ test/CodeGen/AArch64/global-merge-2.ll @@ -33,10 +33,13 @@ ;CHECK: .globl x ;CHECK: x = .L_MergedGlobals +;CHECK: .size x, 4 ;CHECK: .globl y ;CHECK: y = .L_MergedGlobals+4 +;CHECK: .size y, 4 ;CHECK: .globl z ;CHECK: z = .L_MergedGlobals+8 +;CHECK: .size z, 4 ;CHECK-APPLE-IOS: .zerofill __DATA,__bss,l__MergedGlobals,12,3 Index: test/CodeGen/AArch64/global-merge-3.ll =================================================================== --- test/CodeGen/AArch64/global-merge-3.ll +++ test/CodeGen/AArch64/global-merge-3.ll @@ -39,8 +39,10 @@ ;CHECK: z = .L_MergedGlobals ;CHECK: .globl x ;CHECK: x = .L_MergedGlobals+4 +;CHECK: .size x, 4000 ;CHECK: .globl y ;CHECK: y = .L_MergedGlobals.1 +;CHECK: .size y, 4000 ;CHECK-APPLE-IOS-NOT: _z = l__MergedGlobals ;CHECK-APPLE-IOS:.globl _x Index: test/CodeGen/ARM/aliases.ll =================================================================== --- test/CodeGen/ARM/aliases.ll +++ test/CodeGen/ARM/aliases.ll @@ -2,19 +2,35 @@ ; CHECK: .globl test +; CHECK: .Lstructvar: +; CHECK: .size .Lstructvar, 8 + ; CHECK: .globl foo1 ; CHECK: foo1 = bar +; CHECK-NOT: .size foo1 ; CHECK: .globl foo2 ; CHECK: foo2 = bar +; CHECK-NOT: .size foo2 ; CHECK: .weak bar_f ; CHECK: bar_f = foo_f +; CHECK-NOT: .size bar_f ; CHECK: bar_i = bar +; CHECK-NOT: .size bar_i ; CHECK: .globl A ; CHECK: A = bar +; CHECK-NOT: .size A + +; CHECK: .globl elem0 +; CHECK: elem0 = .Lstructvar +; CHECK: .size elem0, 4 + +; CHECK: .globl elem1 +; CHECK: elem1 = .Lstructvar+4 +; CHECK: .size elem1, 4 @bar = global i32 42 @foo1 = alias i32* @bar @@ -31,6 +47,10 @@ @A = alias bitcast (i32* @bar to i64*) +@structvar = private global {i32, i32} {i32 1, i32 2} +@elem0 = alias getelementptr({i32, i32}, {i32, i32}* @structvar, i32 0, i32 0) +@elem1 = alias getelementptr({i32, i32}, {i32, i32}* @structvar, i32 0, i32 1) + define i32 @test() { entry: %tmp = load i32, i32* @foo1 Index: test/CodeGen/ARM/global-merge-external.ll =================================================================== --- test/CodeGen/ARM/global-merge-external.ll +++ test/CodeGen/ARM/global-merge-external.ll @@ -37,7 +37,10 @@ ;CHECK-MERGE: .globl x ;CHECK-MERGE: x = .L_MergedGlobals +;CHECK-MERGE: .size x, 4 ;CHECK-MERGE: .globl y ;CHECK-MERGE: y = .L_MergedGlobals+4 +;CHECK-MERGE: .size y, 4 ;CHECK-MERGE: .globl z ;CHECK-MERGE: z = .L_MergedGlobals+8 +;CHECK-MERGE: .size z, 4