Redo "Make global aliases have symbol size equal to their type"
authorJohn Brawn <john.brawn@arm.com>
Wed, 12 Aug 2015 15:05:39 +0000 (15:05 +0000)
committerJohn Brawn <john.brawn@arm.com>
Wed, 12 Aug 2015 15:05:39 +0000 (15:05 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244752 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
test/CodeGen/AArch64/global-merge-2.ll
test/CodeGen/AArch64/global-merge-3.ll
test/CodeGen/ARM/aliases.ll
test/CodeGen/ARM/global-merge-external.ll

index 0ea2c66757a5a1597086d1195269f2442027d78a..e69febc6ad68314254fa74e790cc046930a65e8a 100644 (file)
@@ -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<MCSymbolELF>(Name),
+                               MCConstantExpr::create(Size, OutContext));
+    }
   }
 
   GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
index f168bea9e1585192cea7aa1110c97df6ac52dda8..53bed1d9bc0939de10d3a21e40ff96bcd442f039 100644 (file)
@@ -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
 
index 095fa4f7881011658579754591fb1e5dba3c6c39..b2fa0f925eb8578ca518760fcf2c955a4de8f06b 100644 (file)
@@ -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
index 04ca3e875487ed3447c9b1a4c8ef534d6dcaaa17..6307133b63500abb6bd47e9be7c003e2c8725748 100644 (file)
@@ -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
index f379e654f0473a22900208d68c6b30451f186815..a9e0d199705a8b094b5bd39675c5c4ac6dbbe0be 100644 (file)
@@ -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