[llvm] r242520 - Make global aliases have symbol size equal to their type

John Brawn john.brawn at arm.com
Fri Jul 17 05:12:03 PDT 2015


Author: john.brawn
Date: Fri Jul 17 07:12:03 2015
New Revision: 242520

URL: http://llvm.org/viewvc/llvm-project?rev=242520&view=rev
Log:
Make global aliases have symbol size equal to their type

This is mainly for the benefit of GlobalMerge, so that an alias into a
MergedGlobals variable has the same size as the original non-merged
variable.

Differential Revision: http://reviews.llvm.org/D10837

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
    llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll
    llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll
    llvm/trunk/test/CodeGen/ARM/aliases.ll

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=242520&r1=242519&r2=242520&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Fri Jul 17 07:12:03 2015
@@ -1111,6 +1111,16 @@ bool AsmPrinter::doFinalization(Module &
 
     // Emit the directives as assignments aka .set:
     OutStreamer->EmitAssignment(Name, lowerConstant(Alias.getAliasee()));
+
+    // Set the size of the alias symbol if we can, as otherwise the alias gets
+    // the size of the aliasee which may not be correct e.g. if the alias is of
+    // a member of a struct.
+    if (MAI->hasDotTypeDotSizeDirective() && Alias.getValueType()->isSized()) {
+      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>();

Modified: llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll?rev=242520&r1=242519&r2=242520&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll Fri Jul 17 07:12:03 2015
@@ -35,10 +35,13 @@ define void @g1(i32 %a1, i32 %a2) {
 
 ;CHECK:	.globl	x
 ;CHECK: x = _MergedGlobals_x
+;CHECK: .size x, 4
 ;CHECK:	.globl	y
 ;CHECK: y = _MergedGlobals_x+4
+;CHECK: .size y, 4
 ;CHECK:	.globl	z
 ;CHECK: z = _MergedGlobals_x+8
+;CHECK: .size z, 4
 
 ;CHECK-APPLE-IOS: .globl	__MergedGlobals_x       ; @_MergedGlobals_x
 ;CHECK-APPLE-IOS: .zerofill __DATA,__common,__MergedGlobals_x,12,3

Modified: llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll?rev=242520&r1=242519&r2=242520&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll Fri Jul 17 07:12:03 2015
@@ -42,8 +42,10 @@ define void @f1(i32 %a1, i32 %a2, i32 %a
 
 ;CHECK:	.globl	x
 ;CHECK: x = _MergedGlobals_x+4
+;CHECK: .size x, 4000
 ;CHECK:	.globl	y
 ;CHECK: y = _MergedGlobals_y
+;CHECK: .size y, 4000
 
 ;CHECK-APPLE-IOS:.globl	_x
 ;CHECK-APPLE-IOS: _x = __MergedGlobals_x+4

Modified: llvm/trunk/test/CodeGen/ARM/aliases.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/aliases.ll?rev=242520&r1=242519&r2=242520&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/aliases.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/aliases.ll Fri Jul 17 07:12:03 2015
@@ -2,19 +2,34 @@
 
 ; CHECK: .globl	test
 
+; CHECK: .globl structvar
+; CHECK: .size structvar, 8
+
 ; CHECK: .globl	foo1
 ; CHECK: foo1 = bar
+; CHECK: .size foo1, 4
 
 ; CHECK: .globl	foo2
 ; CHECK: foo2 = bar
+; CHECK: .size foo2, 4
 
 ; CHECK: .weak	bar_f
 ; CHECK: bar_f = foo_f
 
 ; CHECK: bar_i = bar
+; CHECK: .size bar_i, 4
 
 ; CHECK: .globl	A
 ; CHECK: A = bar
+; CHECK: .size A, 8
+
+; CHECK: .globl elem0
+; CHECK: elem0 = structvar
+; CHECK: .size elem0, 4
+
+; CHECK: .globl elem1
+; CHECK: elem1 = structvar+4
+; CHECK: .size elem1, 4
 
 @bar = global i32 42
 @foo1 = alias i32* @bar
@@ -31,6 +46,10 @@ define i32 @foo_f() {
 
 @A = alias bitcast (i32* @bar to i64*)
 
+ at structvar = global {i32, i32} {i32 1, i32 2}
+ at elem0 = alias getelementptr({i32, i32}, {i32, i32}*  @structvar, i32 0, i32 0)
+ at elem1 = alias getelementptr({i32, i32}, {i32, i32}*  @structvar, i32 0, i32 1)
+
 define i32 @test() {
 entry:
    %tmp = load i32, i32* @foo1





More information about the llvm-commits mailing list