Hack the hack. If we have a situation where an ASM object is defined but isn't
authorBill Wendling <isanbard@gmail.com>
Mon, 2 Apr 2012 10:01:21 +0000 (10:01 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 2 Apr 2012 10:01:21 +0000 (10:01 +0000)
reflected in the LLVM IR (as a declare or something), then treat it like a data
object.

N.B. This isn't 100% correct. The ASM parser should supply more information so
that we know what type of object it is, and what attributes it should have.

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

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

index 3bd764cb76a1ba9a0d7a904d333980d6bf1f68c5..963bb5309179073c58282dce8637a6987088a5e2 100644 (file)
@@ -400,14 +400,23 @@ void LTOModule::addAsmGlobalSymbol(const char *name,
   NameAndAttributes &info = _undefines[entry.getKey().data()];
 
   if (info.symbol == 0) {
-    // If we haven't seen this symbol before, save it and we may see it again.
-    StringMap<NameAndAttributes>::value_type
-      &asm_entry = _asm_defines.GetOrCreateValue(name);
-    NameAndAttributes &asm_info = _asm_defines[asm_entry.getKey().data()];
-    asm_info.name = name;
-    asm_info.attributes = scope;
-    asm_info.isFunction = false;
-    asm_info.symbol = 0;
+    // FIXME: This is trying to take care of module ASM like this:
+    //
+    //   module asm ".zerofill __FOO, __foo, _bar_baz_qux, 0"
+    //
+    // but is gross and its mother dresses it funny. Have the ASM parser give us
+    // more details for this type of situation so that we're not guessing so
+    // much.
+
+    // fill information structure
+    info.name = name;
+    info.attributes =
+      LTO_SYMBOL_PERMISSIONS_DATA | LTO_SYMBOL_DEFINITION_REGULAR | scope;
+    info.isFunction = false;
+    info.symbol = 0;
+
+    // add to table of symbols
+    _symbols.push_back(info);
     return;
   }
 
@@ -464,20 +473,6 @@ void LTOModule::addPotentialUndefinedSymbol(GlobalValue *decl, bool isFunc) {
   if (entry.getValue().name)
     return;
 
-  StringMap<NameAndAttributes>::value_type &asm_entry =
-    _asm_defines.GetOrCreateValue(name);
-
-  if (asm_entry.getValue().name != 0) {
-    if (isFunc)
-      addDefinedFunctionSymbol(cast<Function>(decl));
-    else
-      addDefinedDataSymbol(decl);
-
-    _symbols.back().attributes &= ~LTO_SYMBOL_SCOPE_MASK;
-    _symbols.back().attributes |= asm_entry.getValue().attributes;
-    return;
-  }
-
   NameAndAttributes info;
 
   info.name = entry.getKey().data();
index 6280c6770d2da5cd465a189259d93a60fe535820..cafb927abfb1210a2b46a22932e919358ed1eaec 100644 (file)
@@ -53,7 +53,6 @@ private:
   // _defines and _undefines only needed to disambiguate tentative definitions
   StringSet                               _defines;
   llvm::StringMap<NameAndAttributes>      _undefines;
-  llvm::StringMap<NameAndAttributes>      _asm_defines;
   std::vector<const char*>                _asm_undefines;
   llvm::MCContext                         _context;