mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242520 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fe6ad9692a
commit
591adee23b
@ -1111,6 +1111,16 @@ bool AsmPrinter::doFinalization(Module &M) {
|
||||
|
||||
// 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>();
|
||||
|
@ -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
|
||||
|
@ -42,8 +42,10 @@ define void @f1(i32 %a1, i32 %a2, i32 %a3) {
|
||||
|
||||
;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
|
||||
|
@ -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*)
|
||||
|
||||
@structvar = 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
|
||||
|
Loading…
Reference in New Issue
Block a user