[lld] r246332 - Start adding support for common symbols.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 28 14:26:51 PDT 2015


Author: rafael
Date: Fri Aug 28 16:26:51 2015
New Revision: 246332

URL: http://llvm.org/viewvc/llvm-project?rev=246332&view=rev
Log:
Start adding support for common symbols.

For now this just recognizes the special section number.

Modified:
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/Symbols.h
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/elf2/symbols.s

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=246332&r1=246331&r2=246332&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Fri Aug 28 16:26:51 2015
@@ -99,11 +99,17 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea
   StringRef Name = *NameOrErr;
 
   uint32_t SecIndex = Sym->st_shndx;
-  if (SecIndex == SHN_ABS)
+  switch (SecIndex) {
+  case SHN_ABS:
     return new (Alloc) DefinedAbsolute<ELFT>(Name, *Sym);
-
-  if (SecIndex == SHN_XINDEX)
+  case SHN_UNDEF:
+    return new (Alloc) Undefined<ELFT>(Name, *Sym);
+  case SHN_COMMON:
+    return new (Alloc) DefinedCommon<ELFT>(Name, *Sym);
+  case SHN_XINDEX:
     SecIndex = ELFObj->getExtendedSymbolTableIndex(Sym, Symtab, SymtabSHNDX);
+    break;
+  }
 
   if (SecIndex >= Chunks.size() ||
       (SecIndex != 0 && !Chunks[SecIndex]))
@@ -114,8 +120,6 @@ SymbolBody *elf2::ObjectFile<ELFT>::crea
     error("unexpected binding");
   case STB_GLOBAL:
   case STB_WEAK:
-    if (Sym->isUndefined())
-      return new (Alloc) Undefined<ELFT>(Name, *Sym);
     return new (Alloc) DefinedRegular<ELFT>(Name, *Sym, *Chunks[SecIndex]);
   }
 }

Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=246332&r1=246331&r2=246332&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Fri Aug 28 16:26:51 2015
@@ -40,9 +40,10 @@ public:
     DefinedFirst = 0,
     DefinedRegularKind = 0,
     DefinedAbsoluteKind = 1,
-    DefinedLast = 1,
-    UndefinedKind = 2,
-    UndefinedSyntheticKind = 3
+    DefinedCommonKind = 2,
+    DefinedLast = 2,
+    UndefinedKind = 3,
+    UndefinedSyntheticKind = 4
   };
 
   Kind kind() const { return static_cast<Kind>(SymbolKind); }
@@ -134,6 +135,19 @@ public:
   }
 };
 
+template <class ELFT> class DefinedCommon : public Defined<ELFT> {
+  typedef ELFSymbolBody<ELFT> Base;
+  typedef typename Base::Elf_Sym Elf_Sym;
+
+public:
+  explicit DefinedCommon(StringRef N, const Elf_Sym &Sym)
+      : Defined<ELFT>(Base::DefinedCommonKind, N, Sym) {}
+
+  static bool classof(const SymbolBody *S) {
+    return S->kind() == Base::DefinedCommonKind;
+  }
+};
+
 // Regular defined symbols read from object file symbol tables.
 template <class ELFT> class DefinedRegular : public Defined<ELFT> {
   typedef Defined<ELFT> Base;

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=246332&r1=246331&r2=246332&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Aug 28 16:26:51 2015
@@ -310,6 +310,7 @@ template <class ELFT> void SymbolTableSe
     }
     case SymbolBody::UndefinedKind:
       assert(Body->isWeak() && "Should be defined by now");
+    case SymbolBody::DefinedCommonKind:
     case SymbolBody::DefinedAbsoluteKind:
       InputSym = &cast<ELFSymbolBody<ELFT>>(Body)->Sym;
       break;

Modified: lld/trunk/test/elf2/symbols.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/symbols.s?rev=246332&r1=246331&r2=246332&view=diff
==============================================================================
--- lld/trunk/test/elf2/symbols.s (original)
+++ lld/trunk/test/elf2/symbols.s Fri Aug 28 16:26:51 2015
@@ -31,6 +31,8 @@ zed3:
 .globl abs
 abs = 0x123
 
+.comm common,4,4
+
 // CHECK:      Name: .text
 // CHECK-NEXT: Type: SHT_PROGBITS
 // CHECK-NEXT: Flags [
@@ -93,6 +95,15 @@ abs = 0x123
 // CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name: common (34)
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 4
+// CHECK-NEXT:     Binding: Global (0x1)
+// CHECK-NEXT:     Type: Object (0x1)
+// CHECK-NEXT:     Other: 0
+// CHECK-NEXT:     Section: Undefined (0x0)
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: zed
 // CHECK-NEXT:     Value: 0x1004
 // CHECK-NEXT:     Size: 0




More information about the llvm-commits mailing list