[lld] r332019 - COFF: Don't create unnecessary thunks.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Thu May 10 12:01:28 PDT 2018
Author: pcc
Date: Thu May 10 12:01:28 2018
New Revision: 332019
URL: http://llvm.org/viewvc/llvm-project?rev=332019&view=rev
Log:
COFF: Don't create unnecessary thunks.
A thunk is only needed if a relocation points to the undecorated
import name.
Differential Revision: https://reviews.llvm.org/D46673
Modified:
lld/trunk/COFF/InputFiles.h
lld/trunk/COFF/MarkLive.cpp
lld/trunk/COFF/Symbols.cpp
lld/trunk/COFF/Writer.cpp
lld/trunk/test/COFF/delayimports-armnt.yaml
Modified: lld/trunk/COFF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.h?rev=332019&r1=332018&r2=332019&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.h (original)
+++ lld/trunk/COFF/InputFiles.h Thu May 10 12:01:28 2018
@@ -201,8 +201,7 @@ private:
// for details about the format.
class ImportFile : public InputFile {
public:
- explicit ImportFile(MemoryBufferRef M)
- : InputFile(ImportKind, M), Live(!Config->DoGC) {}
+ explicit ImportFile(MemoryBufferRef M) : InputFile(ImportKind, M) {}
static bool classof(const InputFile *F) { return F->kind() == ImportKind; }
@@ -221,12 +220,15 @@ public:
Chunk *Location = nullptr;
// We want to eliminate dllimported symbols if no one actually refers them.
- // This "Live" bit is used to keep track of which import library members
+ // These "Live" bits are used to keep track of which import library members
// are actually in use.
//
// If the Live bit is turned off by MarkLive, Writer will ignore dllimported
- // symbols provided by this import library member.
- bool Live;
+ // symbols provided by this import library member. We also track whether the
+ // imported symbol is used separately from whether the thunk is used in order
+ // to avoid creating unnecessary thunks.
+ bool Live = !Config->DoGC;
+ bool ThunkLive = !Config->DoGC;
};
// Used for LTO.
Modified: lld/trunk/COFF/MarkLive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/MarkLive.cpp?rev=332019&r1=332018&r2=332019&view=diff
==============================================================================
--- lld/trunk/COFF/MarkLive.cpp (original)
+++ lld/trunk/COFF/MarkLive.cpp Thu May 10 12:01:28 2018
@@ -48,7 +48,7 @@ void markLive(ArrayRef<Chunk *> Chunks)
else if (auto *Sym = dyn_cast<DefinedImportData>(B))
Sym->File->Live = true;
else if (auto *Sym = dyn_cast<DefinedImportThunk>(B))
- Sym->WrappedSym->File->Live = true;
+ Sym->WrappedSym->File->Live = Sym->WrappedSym->File->ThunkLive = true;
};
// Add GC root chunks.
Modified: lld/trunk/COFF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Symbols.cpp?rev=332019&r1=332018&r2=332019&view=diff
==============================================================================
--- lld/trunk/COFF/Symbols.cpp (original)
+++ lld/trunk/COFF/Symbols.cpp Thu May 10 12:01:28 2018
@@ -58,7 +58,7 @@ bool Symbol::isLive() const {
if (auto *Imp = dyn_cast<DefinedImportData>(this))
return Imp->File->Live;
if (auto *Imp = dyn_cast<DefinedImportThunk>(this))
- return Imp->WrappedSym->File->Live;
+ return Imp->WrappedSym->File->ThunkLive;
// Assume any other kind of symbol is live.
return true;
}
Modified: lld/trunk/COFF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=332019&r1=332018&r2=332019&view=diff
==============================================================================
--- lld/trunk/COFF/Writer.cpp (original)
+++ lld/trunk/COFF/Writer.cpp Thu May 10 12:01:28 2018
@@ -543,14 +543,10 @@ void Writer::createImportTables() {
std::string DLL = StringRef(File->DLLName).lower();
if (Config->DLLOrder.count(DLL) == 0)
Config->DLLOrder[DLL] = Config->DLLOrder.size();
- }
-
- for (ImportFile *File : ImportFile::Instances) {
- if (!File->Live)
- continue;
if (DefinedImportThunk *Thunk = File->ThunkSym)
- TextSec->addChunk(Thunk->getChunk());
+ if (File->ThunkLive)
+ TextSec->addChunk(Thunk->getChunk());
if (Config->DelayLoads.count(StringRef(File->DLLName).lower())) {
if (!File->ThunkSym)
Modified: lld/trunk/test/COFF/delayimports-armnt.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/delayimports-armnt.yaml?rev=332019&r1=332018&r2=332019&view=diff
==============================================================================
--- lld/trunk/test/COFF/delayimports-armnt.yaml (original)
+++ lld/trunk/test/COFF/delayimports-armnt.yaml Thu May 10 12:01:28 2018
@@ -20,7 +20,7 @@
# IMPORT-NEXT: UnloadDelayImportTable: 0x0
# IMPORT-NEXT: Import {
# IMPORT-NEXT: Symbol: function (0)
-# IMPORT-NEXT: Address: 0x401019
+# IMPORT-NEXT: Address: 0x40100D
# IMPORT-NEXT: }
# IMPORT-NEXT: }
#
@@ -35,11 +35,11 @@
# BASEREL-NEXT: }
# BASEREL-NEXT: Entry {
# BASEREL-NEXT: Type: ARM_MOV32(T)
-# BASEREL-NEXT: Address: 0x1018
+# BASEREL-NEXT: Address: 0x1022
# BASEREL-NEXT: }
# BASEREL-NEXT: Entry {
-# BASEREL-NEXT: Type: ARM_MOV32(T)
-# BASEREL-NEXT: Address: 0x102E
+# BASEREL-NEXT: Type: ABSOLUTE
+# BASEREL-NEXT: Address: 0x1000
# BASEREL-NEXT: }
# BASEREL-NEXT: Entry {
# BASEREL-NEXT: Type: HIGHLOW
@@ -51,19 +51,19 @@
# BASEREL-NEXT: }
# BASEREL-NEXT: ]
#
-# DISASM: 401018: 43 f2 08 0c movw r12, #12296
-# DISASM-NEXT: 40101c: c0 f2 40 0c movt r12, #64
-# DISASM-NEXT: 401020: 2d e9 0f 48 push.w {r0, r1, r2, r3, r11, lr}
-# DISASM-NEXT: 401024: 0d f2 10 0b addw r11, sp, #16
-# DISASM-NEXT: 401028: 2d ed 10 0b vpush {d0, d1, d2, d3, d4, d5, d6, d7}
-# DISASM-NEXT: 40102c: 61 46 mov r1, r12
-# DISASM-NEXT: 40102e: 42 f2 00 00 movw r0, #8192
-# DISASM-NEXT: 401032: c0 f2 40 00 movt r0, #64
-# DISASM-NEXT: 401036: ff f7 e3 ff bl #-58
-# DISASM-NEXT: 40103a: 84 46 mov r12, r0
-# DISASM-NEXT: 40103c: bd ec 10 0b vpop {d0, d1, d2, d3, d4, d5, d6, d7}
-# DISASM-NEXT: 401040: bd e8 0f 48 pop.w {r0, r1, r2, r3, r11, lr}
-# DISASM-NEXT: 401044: 60 47 bx r12
+# DISASM: 40100c: 43 f2 08 0c movw r12, #12296
+# DISASM-NEXT: c0 f2 40 0c movt r12, #64
+# DISASM-NEXT: 2d e9 0f 48 push.w {r0, r1, r2, r3, r11, lr}
+# DISASM-NEXT: 0d f2 10 0b addw r11, sp, #16
+# DISASM-NEXT: 2d ed 10 0b vpush {d0, d1, d2, d3, d4, d5, d6, d7}
+# DISASM-NEXT: 61 46 mov r1, r12
+# DISASM-NEXT: 42 f2 00 00 movw r0, #8192
+# DISASM-NEXT: c0 f2 40 00 movt r0, #64
+# DISASM-NEXT: ff f7 e9 ff bl #-46
+# DISASM-NEXT: 84 46 mov r12, r0
+# DISASM-NEXT: bd ec 10 0b vpop {d0, d1, d2, d3, d4, d5, d6, d7}
+# DISASM-NEXT: bd e8 0f 48 pop.w {r0, r1, r2, r3, r11, lr}
+# DISASM-NEXT: 60 47 bx r12
--- !COFF
header:
More information about the llvm-commits
mailing list