Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit f6b4f8d

Browse files
committed
[MIPS] Set STO_MIPS_MICROMIPS flag and less-significant bit for microMIPS symbols
microMIPS symbols including microMIPS PLT records created for regular symbols needs to be marked by STO_MIPS_MICROMIPS flag in a symbol table. Additionally microMIPS entries in a dynamic symbol table should have configured less-significant bit. That allows to escape teaching a dynamic linker about microMIPS symbols. git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@318097 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 09bccfd commit f6b4f8d

File tree

5 files changed

+60
-4
lines changed

5 files changed

+60
-4
lines changed

ELF/Arch/Mips.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,6 @@ template <class ELFT> RelType MIPS<ELFT>::getDynRel(RelType Type) const {
191191
return RelativeRel;
192192
}
193193

194-
static bool isMicroMips() { return Config->EFlags & EF_MIPS_MICROMIPS; }
195-
196194
template <class ELFT>
197195
void MIPS<ELFT>::writeGotPlt(uint8_t *Buf, const Symbol &) const {
198196
uint64_t VA = InX::Plt->getVA();

ELF/Arch/MipsArchTree.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,8 @@ bool elf::isMipsN32Abi(const InputFile *F) {
364364
}
365365
}
366366

367+
bool elf::isMicroMips() { return Config->EFlags & EF_MIPS_MICROMIPS; }
368+
367369
bool elf::isMipsR6() {
368370
uint32_t Arch = Config->EFlags & EF_MIPS_ARCH;
369371
return Arch == EF_MIPS_ARCH_32R6 || Arch == EF_MIPS_ARCH_64R6;

ELF/SyntheticSections.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -1621,7 +1621,16 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
16211621
Symbol *Sym = Ent.Sym;
16221622
if (Sym->isInPlt() && Sym->NeedsPltAddr)
16231623
ESym->st_other |= STO_MIPS_PLT;
1624-
1624+
if (isMicroMips()) {
1625+
// Set STO_MIPS_MICROMIPS flag and less-significant bit for
1626+
// defined microMIPS symbols and shared symbols with PLT record.
1627+
if ((Sym->isDefined() && (Sym->StOther & STO_MIPS_MICROMIPS)) ||
1628+
(Sym->isShared() && Sym->NeedsPltAddr)) {
1629+
if (StrTabSec.isDynamic())
1630+
ESym->st_value |= 1;
1631+
ESym->st_other |= STO_MIPS_MICROMIPS;
1632+
}
1633+
}
16251634
if (Config->Relocatable)
16261635
if (auto *D = dyn_cast<Defined>(Sym))
16271636
if (isMipsPIC<ELFT>(D))

ELF/Writer.h

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ uint8_t getMipsFpAbiFlag(uint8_t OldFlag, uint8_t NewFlag,
5454
llvm::StringRef FileName);
5555

5656
bool isMipsN32Abi(const InputFile *F);
57+
bool isMicroMips();
5758
bool isMipsR6();
5859
} // namespace elf
5960
} // namespace lld

test/ELF/mips-micro-plt.s

+47-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,56 @@
66
# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \
77
# RUN: -mattr=micromips %s -o %t-exe.o
88
# RUN: ld.lld %t-exe.o %t.so -o %t.exe
9-
# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck %s
9+
# RUN: llvm-readobj -t -dt -mips-plt-got %t.exe | FileCheck %s
1010

1111
# REQUIRES: mips
1212

13+
# CHECK: Symbols [
14+
# CHECK: Symbol {
15+
# CHECK: Name: foo
16+
# CHECK-NEXT: Value: 0x20008
17+
# CHECK-NEXT: Size:
18+
# CHECK-NEXT: Binding: Local
19+
# CHECK-NEXT: Type: None
20+
# CHECK-NEXT: Other [
21+
# CHECK-NEXT: STO_MIPS_MICROMIPS
22+
# CHECK-NEXT: STV_HIDDEN
23+
# CHECK-NEXT: ]
24+
# CHECK-NEXT: Section: .text
25+
# CHECK-NEXT: }
26+
# CHECK: Symbol {
27+
# CHECK: Name: __start
28+
# CHECK-NEXT: Value: 0x20000
29+
# CHECK-NEXT: Size:
30+
# CHECK-NEXT: Binding: Global
31+
# CHECK-NEXT: Type: None
32+
# CHECK-NEXT: Other [
33+
# CHECK-NEXT: STO_MIPS_MICROMIPS
34+
# CHECK-NEXT: ]
35+
# CHECK-NEXT: Section: .text
36+
# CHECK-NEXT: }
37+
# CHECK: Symbol {
38+
# CHECK: Name: foo0
39+
# CHECK-NEXT: Value: 0x0
40+
# CHECK-NEXT: Size:
41+
# CHECK-NEXT: Binding: Global
42+
# CHECK-NEXT: Type: Function
43+
# CHECK-NEXT: Other: 0
44+
# CHECK-NEXT: Section: Undefined
45+
# CHECK-NEXT: }
46+
# CHECK-NEXT: ]
47+
# CHECK: DynamicSymbols [
48+
# CHECK: Symbol {
49+
# CHECK: Name: foo0
50+
# CHECK-NEXT: Value: 0x0
51+
# CHECK-NEXT: Size:
52+
# CHECK-NEXT: Binding: Global
53+
# CHECK-NEXT: Type: Function
54+
# CHECK-NEXT: Other: 0
55+
# CHECK-NEXT: Section: Undefined
56+
# CHECK-NEXT: }
57+
# CHECK-NEXT: ]
58+
1359
# CHECK: Primary GOT {
1460
# CHECK: Local entries [
1561
# CHECK-NEXT: Entry {

0 commit comments

Comments
 (0)