[llvm] r244752 - Redo "Make global aliases have symbol size equal to their type"
John Brawn via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 12 08:05:40 PDT 2015
Author: john.brawn
Date: Wed Aug 12 10:05:39 2015
New Revision: 244752
URL: http://llvm.org/viewvc/llvm-project?rev=244752&view=rev
Log:
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
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
llvm/trunk/test/CodeGen/ARM/global-merge-external.ll
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=244752&r1=244751&r2=244752&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed Aug 12 10:05:39 2015
@@ -1184,6 +1184,20 @@ bool AsmPrinter::doFinalization(Module &
// 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>();
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=244752&r1=244751&r2=244752&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/global-merge-2.ll Wed Aug 12 10:05:39 2015
@@ -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
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=244752&r1=244751&r2=244752&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/global-merge-3.ll Wed Aug 12 10:05:39 2015
@@ -39,8 +39,10 @@ define void @f1(i32 %a1, i32 %a2, i32 %a
;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
Modified: llvm/trunk/test/CodeGen/ARM/aliases.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/aliases.ll?rev=244752&r1=244751&r2=244752&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/aliases.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/aliases.ll Wed Aug 12 10:05:39 2015
@@ -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*)
+ at structvar = private 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
Modified: llvm/trunk/test/CodeGen/ARM/global-merge-external.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/global-merge-external.ll?rev=244752&r1=244751&r2=244752&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/global-merge-external.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/global-merge-external.ll Wed Aug 12 10:05:39 2015
@@ -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
More information about the llvm-commits
mailing list