mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
Behave a bit more like gnu as and use the symbol (instead of the section)
for any relocation to a symbol defined in a tls section. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120121 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8b4e60c276
commit
25958730df
@ -718,10 +718,17 @@ const MCSymbol *ELFObjectWriter::SymbolToReloc(const MCAssembler &Asm,
|
||||
|
||||
const MCSectionELF &Section =
|
||||
static_cast<const MCSectionELF&>(ASymbol.getSection());
|
||||
const SectionKind secKind = Section.getKind();
|
||||
|
||||
if (Section.getKind().isBSS())
|
||||
if (secKind.isBSS())
|
||||
return NULL;
|
||||
|
||||
if (secKind.isThreadLocal()) {
|
||||
if (Renamed)
|
||||
return Renamed;
|
||||
return &Symbol;
|
||||
}
|
||||
|
||||
MCSymbolRefExpr::VariantKind Kind = Target.getSymA()->getKind();
|
||||
const MCSectionELF &Sec2 =
|
||||
static_cast<const MCSectionELF&>(F.getParent()->getSection());
|
||||
@ -729,8 +736,7 @@ const MCSymbol *ELFObjectWriter::SymbolToReloc(const MCAssembler &Asm,
|
||||
if (&Sec2 != &Section &&
|
||||
(Kind == MCSymbolRefExpr::VK_PLT ||
|
||||
Kind == MCSymbolRefExpr::VK_GOTPCREL ||
|
||||
Kind == MCSymbolRefExpr::VK_GOTOFF ||
|
||||
Kind == MCSymbolRefExpr::VK_NTPOFF)) {
|
||||
Kind == MCSymbolRefExpr::VK_GOTOFF)) {
|
||||
if (Renamed)
|
||||
return Renamed;
|
||||
return &Symbol;
|
||||
|
@ -193,6 +193,14 @@ bool ELFAsmParser::ParseSectionName(StringRef &SectionName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static SectionKind computeSectionKind(unsigned Flags) {
|
||||
if (Flags & MCSectionELF::SHF_EXECINSTR)
|
||||
return SectionKind::getText();
|
||||
if (Flags & MCSectionELF::SHF_TLS)
|
||||
return SectionKind::getThreadData();
|
||||
return SectionKind::getDataRel();
|
||||
}
|
||||
|
||||
// FIXME: This is a work in progress.
|
||||
bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
|
||||
StringRef SectionName;
|
||||
@ -322,9 +330,7 @@ bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
|
||||
return TokError("unknown section type");
|
||||
}
|
||||
|
||||
SectionKind Kind = (Flags & MCSectionELF::SHF_EXECINSTR)
|
||||
? SectionKind::getText()
|
||||
: SectionKind::getDataRel();
|
||||
SectionKind Kind = computeSectionKind(Flags);
|
||||
getStreamer().SwitchSection(getContext().getELFSection(SectionName, Type,
|
||||
Flags, Kind, Size,
|
||||
GroupName));
|
||||
|
@ -114,11 +114,65 @@
|
||||
// CHECK-NEXT: ('r_sym', 0x00000000)
|
||||
// CHECK-NEXT: ('r_type', 0x00000002)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 13 (zed@NTPOFF) is of type R_386_TLS_LE and uses the symbol
|
||||
// Relocation 13 (zed@GOT) is of type R_386_GOT32 and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x0000000d
|
||||
// CHECK-NEXT: (('r_offset', 0x0000004e)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000003)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 14 (zed@GOTOFF) is of type R_386_GOTOFF and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x0000000e
|
||||
// CHECK-NEXT: (('r_offset', 0x00000054)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000009)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 15 (zed@INDNTPOFF) is of type R_386_TLS_IE and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x0000000f
|
||||
// CHECK-NEXT: (('r_offset', 0x0000005a)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x0000000f)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 16 (zed@NTPOFF) is of type R_386_TLS_LE and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x00000010
|
||||
// CHECK-NEXT: (('r_offset', 0x00000060)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000011)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 17 (zed@GOTNTPOFF) is of type R_386_TLS_GOTIE and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x00000011
|
||||
// CHECK-NEXT: (('r_offset', 0x00000066)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000010)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 18 (zed@PLT) is of type R_386_PLT32 and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x00000012
|
||||
// CHECK-NEXT: (('r_offset', 0x0000006b)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000004)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 19 (zed@TLSGD) is of type R_386_TLS_GD and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x00000013
|
||||
// CHECK-NEXT: (('r_offset', 0x00000071)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000012)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 20 (zed@TLSLDM) is of type R_386_TLS_LDM and uses the symbol
|
||||
// CHECK-NEXT: # Relocation 0x00000014
|
||||
// CHECK-NEXT: (('r_offset', 0x00000077)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000013)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 21 (zed@TPOFF) is of type R_386_TLS_LE_32 and uses the symbol
|
||||
// CHECK-NEXT:# Relocation 0x00000015
|
||||
// CHECK-NEXT: (('r_offset', 0x0000007d)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000022)
|
||||
// CHECK-NEXT: ),
|
||||
// Relocation 22 (zed@DTPOFF) is of type R_386_TLS_LDO_32 and uses the symbol
|
||||
// CHECK-NEXT: Relocation 0x00000016
|
||||
// CHECK-NEXT: (('r_offset', 0x00000083)
|
||||
// CHECK-NEXT: ('r_sym', 0x00000004)
|
||||
// CHECK-NEXT: ('r_type', 0x00000020)
|
||||
// CHECK-NEXT: ),
|
||||
|
||||
.text
|
||||
@ -145,7 +199,16 @@ bar2:
|
||||
leal foo@TLSLDM(%ebx), %eax
|
||||
leal foo@DTPOFF(%eax), %edx
|
||||
calll 4096
|
||||
movl zed@GOT(%eax), %eax
|
||||
movl zed@GOTOFF(%eax), %eax
|
||||
movl zed@INDNTPOFF(%eax), %eax
|
||||
movl zed@NTPOFF(%eax), %eax
|
||||
movl zed@GOTNTPOFF(%eax), %eax
|
||||
call zed@PLT
|
||||
movl zed@TLSGD(%eax), %eax
|
||||
movl zed@TLSLDM(%eax), %eax
|
||||
movl zed@TPOFF(%eax), %eax
|
||||
movl zed@DTPOFF(%eax), %eax
|
||||
|
||||
.section zedsec,"awT",@progbits
|
||||
zed:
|
||||
|
Loading…
Reference in New Issue
Block a user