From dcf7a81cdd5ce8f92b90f966e97d56be417ef8ff Mon Sep 17 00:00:00 2001 From: John Brawn Date: Wed, 12 Aug 2015 15:05:39 +0000 Subject: [PATCH] Redo "Make global aliases have symbol size equal to their type" r242520 was reverted in r244313 as the expected behaviour of the alias attribute in C is that the alias has the same size as the aliasee. However we can re-introduce adding the size on the alias when the aliasee does not, from a source code or object perspective, exist as a discrete entity. This happens when the aliasee is not a symbol, or when that symbol is private. Differential Revision: http://reviews.llvm.org/D11943 llvm-svn: 244752 --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 14 ++++++++++++++ test/CodeGen/AArch64/global-merge-2.ll | 3 +++ test/CodeGen/AArch64/global-merge-3.ll | 2 ++ test/CodeGen/ARM/aliases.ll | 20 ++++++++++++++++++++ test/CodeGen/ARM/global-merge-external.ll | 3 +++ 5 files changed, 42 insertions(+) diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 0ea2c66757a..e69febc6ad6 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1184,6 +1184,20 @@ bool AsmPrinter::doFinalization(Module &M) { // 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(); diff --git a/test/CodeGen/AArch64/global-merge-2.ll b/test/CodeGen/AArch64/global-merge-2.ll index f168bea9e15..53bed1d9bc0 100644 --- a/test/CodeGen/AArch64/global-merge-2.ll +++ b/test/CodeGen/AArch64/global-merge-2.ll @@ -33,10 +33,13 @@ define void @g1(i32 %a1, i32 %a2) { ;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 diff --git a/test/CodeGen/AArch64/global-merge-3.ll b/test/CodeGen/AArch64/global-merge-3.ll index 095fa4f7881..b2fa0f925eb 100644 --- a/test/CodeGen/AArch64/global-merge-3.ll +++ b/test/CodeGen/AArch64/global-merge-3.ll @@ -39,8 +39,10 @@ define void @f1(i32 %a1, i32 %a2, i32 %a3) { ;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 diff --git a/test/CodeGen/ARM/aliases.ll b/test/CodeGen/ARM/aliases.ll index 04ca3e87548..6307133b635 100644 --- a/test/CodeGen/ARM/aliases.ll +++ b/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 @@ define i32 @foo_f() { @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 diff --git a/test/CodeGen/ARM/global-merge-external.ll b/test/CodeGen/ARM/global-merge-external.ll index f379e654f04..a9e0d199705 100644 --- a/test/CodeGen/ARM/global-merge-external.ll +++ b/test/CodeGen/ARM/global-merge-external.ll @@ -37,7 +37,10 @@ define void @g1(i32 %a1, i32 %a2) { ;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