MC/AsmParser: Report .stabs directive as unsupported.
[oota-llvm.git] / lib / MC / ELFObjectWriter.cpp
index 9a181621c77bde898de982b9ad26e95ed9ed40b6..d249c92dad594557f4605331eba89ace27c9cdaa 100644 (file)
@@ -435,17 +435,22 @@ static uint64_t SymbolValue(MCSymbolData &Data, const MCAsmLayout &Layout) {
   return 0;
 }
 
-void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD,
-                                      const MCAsmLayout &Layout) {
-  MCSymbolData &OrigData = *MSD.SymbolData;
-  MCSymbolData *AliasData = NULL;
-  if (OrigData.Symbol->isVariable()) {
-    const MCExpr *Value = OrigData.getSymbol().getVariableValue();
+static const MCSymbol &AliasedSymbol(const MCSymbol &Symbol) {
+  const MCSymbol *S = &Symbol;
+  while (S->isVariable()) {
+    const MCExpr *Value = S->getVariableValue();
     assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented");
     const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
-    AliasData = &Layout.getAssembler().getSymbolData(Ref->getSymbol());
+    S = &Ref->getSymbol();
   }
-  MCSymbolData &Data = AliasData ? *AliasData : OrigData;
+  return *S;
+}
+
+void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD,
+                                      const MCAsmLayout &Layout) {
+  MCSymbolData &OrigData = *MSD.SymbolData;
+  MCSymbolData &Data =
+    Layout.getAssembler().getSymbolData(AliasedSymbol(OrigData.getSymbol()));
 
   uint8_t Binding = GetBinding(OrigData);
   uint8_t Visibility = GetVisibility(OrigData);
@@ -592,7 +597,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
 
   bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind());
   if (!Target.isAbsolute()) {
-    Symbol = &Target.getSymA()->getSymbol();
+    Symbol = &AliasedSymbol(Target.getSymA()->getSymbol());
     MCSymbolData &SD = Asm.getSymbolData(*Symbol);
     MCFragment *F = SD.getFragment();
 
@@ -789,40 +794,24 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) {
     if (!isInSymtab(Asm, *it, UsedInReloc.count(&Symbol)))
       continue;
 
-    uint64_t &Entry = StringIndexMap[Symbol.getName()];
-    if (!Entry) {
-      Entry = StringTable.size();
-      StringTable += Symbol.getName();
-      StringTable += '\x00';
-    }
-
     ELFSymbolData MSD;
     MSD.SymbolData = it;
-    MSD.StringIndex = Entry;
     bool Local = isLocal(*it);
 
+    bool Add = false;
     if (it->isCommon()) {
       assert(!Local);
       MSD.SectionIndex = ELF::SHN_COMMON;
-      ExternalSymbolData.push_back(MSD);
+      Add = true;
     } else if (Symbol.isAbsolute()) {
       MSD.SectionIndex = ELF::SHN_ABS;
-      if (Local)
-        LocalSymbolData.push_back(MSD);
-      else
-        ExternalSymbolData.push_back(MSD);
+      Add = true;
     } else if (Symbol.isVariable()) {
-      const MCExpr *Value = Symbol.getVariableValue();
-      assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented");
-      const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
-      const MCSymbol &RefSymbol = Ref->getSymbol();
+      const MCSymbol &RefSymbol = AliasedSymbol(Symbol);
       if (RefSymbol.isDefined()) {
         MSD.SectionIndex = SectionIndexMap.lookup(&RefSymbol.getSection());
         assert(MSD.SectionIndex && "Invalid section index!");
-        if (Local)
-          LocalSymbolData.push_back(MSD);
-        else
-          ExternalSymbolData.push_back(MSD);
+        Add = true;
       }
     } else if (Symbol.isUndefined()) {
       assert(!Local);
@@ -831,11 +820,24 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) {
       // are able to set it.
       if (GetBinding(*it) == ELF::STB_LOCAL)
         SetBinding(*it, ELF::STB_GLOBAL);
-      UndefinedSymbolData.push_back(MSD);
+      Add = true;
     } else {
       MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
       assert(MSD.SectionIndex && "Invalid section index!");
-      if (Local)
+      Add = true;
+    }
+
+    if (Add) {
+      uint64_t &Entry = StringIndexMap[Symbol.getName()];
+      if (!Entry) {
+        Entry = StringTable.size();
+        StringTable += Symbol.getName();
+        StringTable += '\x00';
+      }
+      MSD.StringIndex = Entry;
+      if (MSD.SectionIndex == ELF::SHN_UNDEF)
+        UndefinedSymbolData.push_back(MSD);
+      else if (Local)
         LocalSymbolData.push_back(MSD);
       else
         ExternalSymbolData.push_back(MSD);