summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-08-31 01:46:20 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-08-31 01:46:20 +0000
commitf7d45f08693389c94e284d44b579f92b8eaa5ab7 (patch)
treefad6dd224e9076bb2ddc3e6c4f2221b39bcaa941
parent7b5563aa5c4bd5cb304c58e33a0230a05fd1debf (diff)
downloadbcm5719-llvm-f7d45f08693389c94e284d44b579f92b8eaa5ab7.tar.gz
bcm5719-llvm-f7d45f08693389c94e284d44b579f92b8eaa5ab7.zip
Delete SyntheticUndefined.
Now that resolved is templated anyway, we can use the regular Undefined. llvm-svn: 246407
-rw-r--r--lld/ELF/SymbolTable.cpp14
-rw-r--r--lld/ELF/SymbolTable.h1
-rw-r--r--lld/ELF/Symbols.h24
-rw-r--r--lld/ELF/Writer.cpp2
4 files changed, 18 insertions, 23 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 3efdf12889f..c99f1582996 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -27,25 +27,29 @@ void SymbolTable::addFile(std::unique_ptr<InputFile> File) {
addObject(P);
}
+template <class ELFT> void SymbolTable::init() {
+ resolve<ELFT>(new (Alloc)
+ Undefined<ELFT>("_start", Undefined<ELFT>::Synthetic));
+}
+
void SymbolTable::addObject(ObjectFileBase *File) {
if (!ObjectFiles.empty()) {
ObjectFileBase &Old = *ObjectFiles[0];
if (!Old.isCompatibleWith(*File))
error(Twine(Old.getName() + " is incompatible with " + File->getName()));
} else {
- auto *Start = new (Alloc) SyntheticUndefined("_start");
switch (File->kind()) {
case InputFile::Object32LEKind:
- resolve<ELF32LE>(Start);
+ init<ELF32LE>();
break;
case InputFile::Object32BEKind:
- resolve<ELF32BE>(Start);
+ init<ELF32BE>();
break;
case InputFile::Object64LEKind:
- resolve<ELF64LE>(Start);
+ init<ELF64LE>();
break;
case InputFile::Object64BEKind:
- resolve<ELF64BE>(Start);
+ init<ELF64BE>();
break;
}
}
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index 4e4780599a2..da417e9832a 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -51,6 +51,7 @@ public:
private:
void addObject(ObjectFileBase *File);
+ template <class ELFT> void init();
template <class ELFT> void resolve(SymbolBody *Body);
llvm::DenseMap<StringRef, Symbol *> Symtab;
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index b944301898b..1b09e0113cf 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -42,16 +42,13 @@ public:
DefinedAbsoluteKind = 1,
DefinedCommonKind = 2,
DefinedLast = 2,
- UndefinedKind = 3,
- UndefinedSyntheticKind = 4
+ UndefinedKind = 3
};
Kind kind() const { return static_cast<Kind>(SymbolKind); }
bool isWeak() const { return IsWeak; }
- bool isUndefined() const {
- return SymbolKind == UndefinedKind || SymbolKind == UndefinedSyntheticKind;
- }
+ bool isUndefined() const { return SymbolKind == UndefinedKind; }
bool isDefined() const { return !isUndefined(); }
bool isStrongUndefined() const { return !IsWeak && isUndefined(); }
bool isCommon() const { return SymbolKind == DefinedCommonKind; }
@@ -166,22 +163,14 @@ public:
const SectionChunk<ELFT> &Section;
};
-// Undefined symbols.
-class SyntheticUndefined : public SymbolBody {
-public:
- explicit SyntheticUndefined(StringRef N)
- : SymbolBody(UndefinedKind, N, false) {}
-
- static bool classof(const SymbolBody *S) {
- return S->kind() == UndefinedSyntheticKind;
- }
-};
-
+// Undefined symbol.
template <class ELFT> class Undefined : public ELFSymbolBody<ELFT> {
typedef ELFSymbolBody<ELFT> Base;
typedef typename Base::Elf_Sym Elf_Sym;
public:
+ static Elf_Sym Synthetic;
+
explicit Undefined(StringRef N, const Elf_Sym &Sym)
: ELFSymbolBody<ELFT>(Base::UndefinedKind, N, Sym) {}
@@ -190,6 +179,9 @@ public:
}
};
+template <class ELFT>
+typename Undefined<ELFT>::Elf_Sym Undefined<ELFT>::Synthetic;
+
} // namespace elf2
} // namespace lld
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 5acb5e08dfa..31f64083a87 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -302,8 +302,6 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
const Elf_Sym *InputSym = nullptr;
switch (Body->kind()) {
- case SymbolBody::UndefinedSyntheticKind:
- llvm_unreachable("Should be defined by now");
case SymbolBody::DefinedRegularKind: {
auto *Def = cast<DefinedRegular<ELFT>>(Body);
InputSym = &Def->Sym;
OpenPOWER on IntegriCloud