OSDN Git Service

Refactor IRObjectFile, extract a static CollectAsmUndefinedRefs() method to parse...
authorMehdi Amini <mehdi.amini@apple.com>
Fri, 22 Apr 2016 04:28:05 +0000 (04:28 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Fri, 22 Apr 2016 04:28:05 +0000 (04:28 +0000)
I plan to call this from ThinLTOCodeGenerator.

From: Mehdi Amini <mehdi.amini@apple.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267103 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/IRObjectFile.h
lib/Object/IRObjectFile.cpp

index ef65528..453c0f5 100644 (file)
@@ -59,6 +59,16 @@ public:
   /// error code if not found.
   static ErrorOr<MemoryBufferRef> findBitcodeInObject(const ObjectFile &Obj);
 
+  /// Parse inline ASM and collect the symbols that are not defined in
+  /// the current module.
+  ///
+  /// For each found symbol, call \p AsmUndefinedRefs with the name of the
+  /// symbol found and the associated flags.
+  static void CollectAsmUndefinedRefs(
+      Module &TheModule,
+      const std::function<void(StringRef, BasicSymbolRef::Flags)> &
+          AsmUndefinedRefs);
+
   /// \brief Finds and returns bitcode in the given memory buffer (which may
   /// be either a bitcode file or a native object file with embedded bitcode),
   /// or an error code if not found.
index a4b97ef..8184e04 100644 (file)
@@ -38,12 +38,24 @@ using namespace object;
 IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> Mod)
     : SymbolicFile(Binary::ID_IR, Object), M(std::move(Mod)) {
   Mang.reset(new Mangler());
+  CollectAsmUndefinedRefs(*M, [this](StringRef Name,
+                                     BasicSymbolRef::Flags Flags) {
+    AsmSymbols.push_back(std::make_pair<std::string, uint32_t>(Name, Flags));
+  });
+}
+
+// Parse inline ASM and collect the list of symbols that are not defined in
+// the current module. This is inspired from IRObjectFile.
+void IRObjectFile::CollectAsmUndefinedRefs(
+    Module &TheModule,
+    const std::function<void(StringRef, BasicSymbolRef::Flags)> &
+        AsmUndefinedRefs) {
 
-  const std::string &InlineAsm = M->getModuleInlineAsm();
+  const std::string &InlineAsm = TheModule.getModuleInlineAsm();
   if (InlineAsm.empty())
     return;
 
-  Triple TT(M->getTargetTriple());
+  Triple TT(TheModule.getTargetTriple());
   std::string Err;
   const Target *T = TargetRegistry::lookupTarget(TT.str(), Err);
   if (!T)
@@ -106,8 +118,7 @@ IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> Mod)
       Res |= BasicSymbolRef::SF_Global;
       break;
     }
-    AsmSymbols.push_back(
-        std::make_pair<std::string, uint32_t>(Key, std::move(Res)));
+    AsmUndefinedRefs(Key, BasicSymbolRef::Flags(Res));
   }
 }