Do not forget global definitions from inline asm code block.
authorDevang Patel <dpatel@apple.com>
Wed, 16 Jul 2008 18:06:52 +0000 (18:06 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 16 Jul 2008 18:06:52 +0000 (18:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53693 91177308-0d34-0410-b5e6-96231b3b80d8

tools/lto/LTOModule.cpp
tools/lto/LTOModule.h

index f31f0dfb739c4792ff167985a4eb0a185b1bedf9..ac38d244c40a6726a3bf5bc90d59b1140a80e835 100644 (file)
@@ -238,6 +238,19 @@ void LTOModule::addDefinedSymbol(GlobalValue* def, Mangler &mangler,
     _defines[info.name] = 1;
 }
 
+void LTOModule::addAsmGlobalSymbol(const char *name) {
+  // string is owned by _defines
+  const char *symbolName = ::strdup(name);
+  uint32_t attr = LTO_SYMBOL_DEFINITION_REGULAR;
+  attr |= LTO_SYMBOL_SCOPE_DEFAULT;
+
+  // add to table of symbols
+  NameAndAttributes info;
+  info.name = symbolName;
+  info.attributes = (lto_symbol_attributes)attr;
+  _symbols.push_back(info);
+  _defines[info.name] = 1;
+}
 
 void LTOModule::addPotentialUndefinedSymbol(GlobalValue* decl, Mangler &mangler)
 {   
@@ -297,6 +310,32 @@ void LTOModule::lazyParseSymbols()
                 addDefinedDataSymbol(v, mangler);
         }
 
+        // add asm globals
+        const std::string &inlineAsm = _module->getModuleInlineAsm();
+        const std::string glbl = ".globl";
+        std::string asmSymbolName;
+        std::string::size_type pos = inlineAsm.find(glbl, 0);
+        while (pos != std::string::npos) {
+          // eat .globl
+          pos = pos + 6;
+
+          // skip white space between .globl and symbol name
+          std::string::size_type pbegin = inlineAsm.find_first_not_of(' ', pos);
+          if (pbegin == std::string::npos)
+            break;
+
+          // find end-of-line
+          std::string::size_type pend = inlineAsm.find_first_of('\n', pbegin);
+          if (pend == std::string::npos)
+            break;
+
+          asmSymbolName.assign(inlineAsm, pbegin, pbegin-pend);
+          addAsmGlobalSymbol(asmSymbolName.c_str());
+
+          // search next .globl
+          pos = inlineAsm.find(glbl, pend);
+        }
+
         // make symbols for all undefines
         for (StringSet::iterator it=_undefines.begin(); 
                                                 it != _undefines.end(); ++it) {
index 40f92f9816523bb2091d9ddecfea38e09ab7ff29..0cb9cdc8b0cff78fbc00b273459210b1f765bc13 100644 (file)
@@ -76,6 +76,7 @@ private:
                                                         llvm::Mangler &mangler);
     void                    addDefinedDataSymbol(llvm::GlobalValue* v, 
                                                         llvm::Mangler &mangler);
+    void                    addAsmGlobalSymbol(const char *);
     static bool             isTargetMatch(llvm::MemoryBuffer* memBuffer, 
                                                     const char* triplePrefix);