Skip to content

Commit

Permalink
Redo "Make global aliases have symbol size equal to their type"
Browse files Browse the repository at this point in the history
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
  • Loading branch information
john-brawn-arm committed Aug 12, 2015
1 parent 3349f89 commit 75fc09d
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 0 deletions.
14 changes: 14 additions & 0 deletions llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Expand Up @@ -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>();
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/CodeGen/AArch64/global-merge-2.ll
Expand Up @@ -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

Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/AArch64/global-merge-3.ll
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions llvm/test/CodeGen/ARM/aliases.ll
Expand Up @@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/CodeGen/ARM/global-merge-external.ll
Expand Up @@ -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

0 comments on commit 75fc09d

Please sign in to comment.