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:
Rafael Espindola 2010-11-24 21:57:39 +00:00
parent 8b4e60c276
commit 25958730df
3 changed files with 82 additions and 7 deletions

View File

@ -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;

View File

@ -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));

View File

@ -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: