mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-23 05:29:23 +00:00
[SPARC] Repair GOT references to internal symbols.
They had been getting emitted as a section + offset reference, which is bogus since the value needs to be the offset within the GOT, not the actual address of the symbol's object. Differential Revision: http://reviews.llvm.org/D10441 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240020 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f314160e32
commit
d280420ee9
@ -83,7 +83,7 @@ ELF_RELOC(R_SPARC_TLS_DTPOFF64, 77)
|
|||||||
ELF_RELOC(R_SPARC_TLS_TPOFF32, 78)
|
ELF_RELOC(R_SPARC_TLS_TPOFF32, 78)
|
||||||
ELF_RELOC(R_SPARC_TLS_TPOFF64, 79)
|
ELF_RELOC(R_SPARC_TLS_TPOFF64, 79)
|
||||||
ELF_RELOC(R_SPARC_GOTDATA_HIX22, 80)
|
ELF_RELOC(R_SPARC_GOTDATA_HIX22, 80)
|
||||||
ELF_RELOC(R_SPARC_GOTDATA_LOX22, 81)
|
ELF_RELOC(R_SPARC_GOTDATA_LOX10, 81)
|
||||||
ELF_RELOC(R_SPARC_GOTDATA_OP_HIX22, 82)
|
ELF_RELOC(R_SPARC_GOTDATA_OP_HIX22, 82)
|
||||||
ELF_RELOC(R_SPARC_GOTDATA_OP_LOX22, 83)
|
ELF_RELOC(R_SPARC_GOTDATA_OP_LOX10, 83)
|
||||||
ELF_RELOC(R_SPARC_GOTDATA_OP, 84)
|
ELF_RELOC(R_SPARC_GOTDATA_OP, 84)
|
||||||
|
@ -947,6 +947,8 @@ bool SparcAsmParser::matchRegisterName(const AsmToken &Tok,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Determine if an expression contains a reference to the symbol
|
||||||
|
// "_GLOBAL_OFFSET_TABLE_".
|
||||||
static bool hasGOTReference(const MCExpr *Expr) {
|
static bool hasGOTReference(const MCExpr *Expr) {
|
||||||
switch (Expr->getKind()) {
|
switch (Expr->getKind()) {
|
||||||
case MCExpr::Target:
|
case MCExpr::Target:
|
||||||
@ -998,6 +1000,13 @@ bool SparcAsmParser::matchSparcAsmModifiers(const MCExpr *&EVal,
|
|||||||
|
|
||||||
bool isPIC = getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_;
|
bool isPIC = getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_;
|
||||||
|
|
||||||
|
// Ugly: if a sparc assembly expression says "%hi(...)" but the
|
||||||
|
// expression within contains _GLOBAL_OFFSET_TABLE_, it REALLY means
|
||||||
|
// %pc22. Same with %lo -> %pc10. Worse, if it doesn't contain that,
|
||||||
|
// the meaning depends on whether the assembler was invoked with
|
||||||
|
// -KPIC or not: if so, it really means %got22/%got10; if not, it
|
||||||
|
// actually means what it said! Sigh, historical mistakes...
|
||||||
|
|
||||||
switch(VK) {
|
switch(VK) {
|
||||||
default: break;
|
default: break;
|
||||||
case SparcMCExpr::VK_Sparc_LO:
|
case SparcMCExpr::VK_Sparc_LO:
|
||||||
|
@ -31,6 +31,10 @@ namespace {
|
|||||||
protected:
|
protected:
|
||||||
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
||||||
bool IsPCRel) const override;
|
bool IsPCRel) const override;
|
||||||
|
|
||||||
|
bool needsRelocateWithSymbol(const MCSymbol &Sym,
|
||||||
|
unsigned Type) const override;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +109,27 @@ unsigned SparcELFObjectWriter::GetRelocType(const MCValue &Target,
|
|||||||
return ELF::R_SPARC_NONE;
|
return ELF::R_SPARC_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SparcELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym,
|
||||||
|
unsigned Type) const {
|
||||||
|
switch (Type) {
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// All relocations that use a GOT need a symbol, not an offset, as
|
||||||
|
// the offset of the symbol within the section is irrelevant to
|
||||||
|
// where the GOT entry is. Don't need to list all the TLS entries,
|
||||||
|
// as they're all marked as requiring a symbol anyways.
|
||||||
|
case ELF::R_SPARC_GOT10:
|
||||||
|
case ELF::R_SPARC_GOT13:
|
||||||
|
case ELF::R_SPARC_GOT22:
|
||||||
|
case ELF::R_SPARC_GOTDATA_HIX22:
|
||||||
|
case ELF::R_SPARC_GOTDATA_LOX10:
|
||||||
|
case ELF::R_SPARC_GOTDATA_OP_HIX22:
|
||||||
|
case ELF::R_SPARC_GOTDATA_OP_LOX10:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MCObjectWriter *llvm::createSparcELFObjectWriter(raw_pwrite_stream &OS,
|
MCObjectWriter *llvm::createSparcELFObjectWriter(raw_pwrite_stream &OS,
|
||||||
bool Is64Bit,
|
bool Is64Bit,
|
||||||
bool IsLittleEndian,
|
bool IsLittleEndian,
|
||||||
|
@ -3,29 +3,35 @@
|
|||||||
|
|
||||||
;CHECK-ABS: Relocations [
|
;CHECK-ABS: Relocations [
|
||||||
;CHECK-ABS: 0x{{[0-9,A-F]+}} R_SPARC_H44 AGlobalVar 0x0
|
;CHECK-ABS: 0x{{[0-9,A-F]+}} R_SPARC_H44 AGlobalVar 0x0
|
||||||
;CHECK-ABS: 0x{{[0-9,A-F]+}} R_SPARC_M44 AGlobalVar 0x0
|
;CHECK-ABS-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_M44 AGlobalVar 0x0
|
||||||
;CHECK-ABS: 0x{{[0-9,A-F]+}} R_SPARC_L44 AGlobalVar 0x0
|
;CHECK-ABS-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_L44 AGlobalVar 0x0
|
||||||
;CHECK-ABS: 0x{{[0-9,A-F]+}} R_SPARC_WDISP30 bar 0x0
|
;CHECK-ABS-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_H44 .rodata.str1.1 0x0
|
||||||
|
;CHECK-ABS-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_M44 .rodata.str1.1 0x0
|
||||||
|
;CHECK-ABS-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_WDISP30 bar 0x0
|
||||||
|
;CHECK-ABS-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_L44 .rodata.str1.1 0x0
|
||||||
;CHECK-ABS: ]
|
;CHECK-ABS: ]
|
||||||
|
|
||||||
; CHECK-PIC: Relocations [
|
; CHECK-PIC: Relocations [
|
||||||
; CHECK-PIC: 0x{{[0-9,A-F]+}} R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_ 0x4
|
; CHECK-PIC: 0x{{[0-9,A-F]+}} R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_ 0x4
|
||||||
; CHECK-PIC: 0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
|
; CHECK-PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
|
||||||
; CHECK-PIC: 0x{{[0-9,A-F]+}} R_SPARC_GOT22 AGlobalVar 0x0
|
; CHECK-PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT22 AGlobalVar 0x0
|
||||||
; CHECK-PIC: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 AGlobalVar 0x0
|
; CHECK-PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 AGlobalVar 0x0
|
||||||
; CHECK-PIC: 0x{{[0-9,A-F]+}} R_SPARC_WPLT30 bar 0x0
|
; CHECK-PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT22 .L.mystr 0x0
|
||||||
|
; CHECK-PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 .L.mystr 0x0
|
||||||
|
; CHECK-PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_WPLT30 bar 0x0
|
||||||
; CHECK-PIC: ]
|
; CHECK-PIC: ]
|
||||||
|
|
||||||
|
|
||||||
@AGlobalVar = global i64 0, align 8
|
@AGlobalVar = global i64 0, align 8
|
||||||
|
@.mystr = private unnamed_addr constant [6 x i8] c"hello\00", align 1
|
||||||
|
|
||||||
define i64 @foo(i64 %a) {
|
define i64 @foo(i64 %a) {
|
||||||
entry:
|
entry:
|
||||||
%0 = load i64, i64* @AGlobalVar, align 4
|
%0 = load i64, i64* @AGlobalVar, align 4
|
||||||
%1 = add i64 %a, %0
|
%1 = add i64 %a, %0
|
||||||
%2 = call i64 @bar(i64 %1)
|
%2 = call i64 @bar(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.mystr, i32 0, i32 0), i64 %1)
|
||||||
ret i64 %2
|
ret i64 %2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
declare i64 @bar(i64)
|
declare i64 @bar(i8*, i64)
|
||||||
|
@ -7,9 +7,16 @@
|
|||||||
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
|
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_PC10 _GLOBAL_OFFSET_TABLE_ 0x8
|
||||||
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT22 AGlobalVar 0x0
|
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT22 AGlobalVar 0x0
|
||||||
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 AGlobalVar 0x0
|
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 AGlobalVar 0x0
|
||||||
|
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT22 .LC0 0x0
|
||||||
|
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 .LC0 0x0
|
||||||
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_WPLT30 bar 0x0
|
! CHECK-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_WPLT30 bar 0x0
|
||||||
! CHECK: ]
|
! CHECK: ]
|
||||||
|
|
||||||
|
.section ".rodata"
|
||||||
|
.align 8
|
||||||
|
.LC0:
|
||||||
|
.asciz "string"
|
||||||
|
.section ".text"
|
||||||
.text
|
.text
|
||||||
.globl foo
|
.globl foo
|
||||||
.align 4
|
.align 4
|
||||||
@ -29,8 +36,11 @@ foo:
|
|||||||
add %i1, %o7, %i1
|
add %i1, %o7, %i1
|
||||||
sethi %hi(AGlobalVar), %i2
|
sethi %hi(AGlobalVar), %i2
|
||||||
add %i2, %lo(AGlobalVar), %i2
|
add %i2, %lo(AGlobalVar), %i2
|
||||||
ldx [%i1+%i2], %i1
|
ldx [%i1+%i2], %i3
|
||||||
ldx [%i1], %i1
|
ldx [%i3], %i3
|
||||||
|
sethi %hi(.LC0), %i2
|
||||||
|
add %i2, %lo(.LC0), %i2
|
||||||
|
ldx [%i1+%i2], %i4
|
||||||
call bar
|
call bar
|
||||||
add %i0, %i1, %o0
|
add %i0, %i1, %o0
|
||||||
ret
|
ret
|
||||||
@ -46,4 +56,3 @@ foo:
|
|||||||
AGlobalVar:
|
AGlobalVar:
|
||||||
.xword 0 ! 0x0
|
.xword 0 ! 0x0
|
||||||
.size AGlobalVar, 8
|
.size AGlobalVar, 8
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user