Provide a version of getSymbolOffset that returns false on error.
[oota-llvm.git] / lib / MC / ELFObjectWriter.cpp
index 27e34da6322e8a0929e08acdeaedcd6a99eaf266..9c224b3da6a8fce499f61bc5dc74895bac61c5bf 100644 (file)
@@ -486,34 +486,16 @@ void ELFObjectWriter::WriteHeader(const MCAssembler &Asm,
     Write16(ShstrtabIndex);
 }
 
-uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &OrigData,
+uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &Data,
                                       const MCAsmLayout &Layout) {
-  MCSymbolData *Data = &OrigData;
-  if (Data->isCommon() && Data->isExternal())
-    return Data->getCommonAlignment();
-
-  const MCSymbol *Symbol = &Data->getSymbol();
-  MCAssembler &Asm = Layout.getAssembler();
-  bool IsThumb = Asm.isThumbFunc(Symbol);
-
-  // Given how we implement symver, we can end up with an symbol reference
-  // to an undefined symbol. Walk past it first.
-  if (Symbol->isVariable()) {
-    const MCExpr *Expr = Symbol->getVariableValue();
-    if (auto *Ref = dyn_cast<MCSymbolRefExpr>(Expr)) {
-      if (Ref->getKind() == MCSymbolRefExpr::VK_None) {
-        Symbol = &Ref->getSymbol();
-        Data = &Asm.getOrCreateSymbolData(*Symbol);
-      }
-    }
-  }
+  if (Data.isCommon() && Data.isExternal())
+    return Data.getCommonAlignment();
 
-  if (!Symbol->isVariable() && !Data->getFragment())
+  uint64_t Res;
+  if (!Layout.getSymbolOffset(&Data, Res))
     return 0;
 
-  uint64_t Res = Layout.getSymbolOffset(Data);
-
-  if (IsThumb)
+  if (Layout.getAssembler().isThumbFunc(&Data.getSymbol()))
     Res |= 1;
 
   return Res;