[PATCH] D31660: [LLD][ELF] Allow multiple thunks to be added for a symbol.

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 5 05:47:38 PDT 2017


peter.smith updated this revision to Diff 94207.
peter.smith added a comment.

Rebase to account for changes made in https://reviews.llvm.org/D31654


https://reviews.llvm.org/D31660

Files:
  ELF/Relocations.cpp
  ELF/Relocations.h


Index: ELF/Relocations.h
===================================================================
--- ELF/Relocations.h
+++ ELF/Relocations.h
@@ -133,14 +133,17 @@
 
   uint32_t Pass = 0;
 
-  // Track Symbols that already have a Thunk
-  llvm::DenseMap<SymbolBody *, Thunk *> ThunkedSymbols;
+  // Record all the available Thunks for a Symbol
+  llvm::DenseMap<SymbolBody *, std::vector<Thunk *>> ThunkedSymbols;
 
   // Find a Thunk from the Thunks symbol definition, we can use this to find
   // the Thunk from a relocation to the Thunks symbol definition.
   llvm::DenseMap<SymbolBody *, Thunk *> Thunks;
 
-  // Track InputSections that have a ThunkSection placed in front
+  // Track InputSections that have an inline ThunkSection placed in front
+  // an inline ThunkSection may have control fall through to the section below
+  // so we need to make sure that there is only one of them.
+  // The Mips LA25 Thunk is an example of an inline ThunkSection.
   llvm::DenseMap<InputSection *, ThunkSection *> ThunkedSections;
 
   // All the ThunkSections that we have created, organised by OutputSection
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -1000,10 +1000,20 @@
 template <class ELFT>
 std::pair<Thunk *, bool> ThunkCreator<ELFT>::getThunk(SymbolBody &Body,
                                                       uint32_t Type) {
-  auto res = ThunkedSymbols.insert({&Body, nullptr});
-  if (res.second || !res.first->second->compatibleWith(Type))
-    res.first->second = addThunk<ELFT>(Type, Body);
-  return std::make_pair(res.first->second, res.second);
+  Thunk *T = nullptr;
+  auto Res = ThunkedSymbols.insert({&Body, std::vector<Thunk *>()});
+  if (!Res.second) {
+    // Check existing Thunks for Body to see if they can be reused
+    for (Thunk *ET : Res.first->second)
+      if (ET->compatibleWith(Type)) {
+        T = ET;
+        return std::make_pair(T, Res.second);
+      }
+  }
+  // No existing compatible Thunk in range, create a new one
+  T = addThunk<ELFT>(Type, Body);
+  Res.first->second.push_back(T);
+  return std::make_pair(T, true);
 }
 
 // Make a new ThunkSection at offset Off and it to the persistent and per pass


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31660.94207.patch
Type: text/x-patch
Size: 2260 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170405/005a3346/attachment.bin>


More information about the llvm-commits mailing list