summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2013-06-28 03:41:07 +0000
committerRui Ueyama <ruiu@google.com>2013-06-28 03:41:07 +0000
commit1a54aad50b3547e025f4e553d548ae9e5cd7d783 (patch)
tree30f958687f99aabe22073eb99aee181994e3a884
parentfbfdced30ff483dd8e4dd74b811122a63da06611 (diff)
downloadbcm5719-llvm-1a54aad50b3547e025f4e553d548ae9e5cd7d783.tar.gz
bcm5719-llvm-1a54aad50b3547e025f4e553d548ae9e5cd7d783.zip
[PECOFF][Writer] Templatize connectAtomsWithLayoutEdge()
Templatize connectAtomsWithLayoutEdge() so that it can handle other types of defined atoms. llvm-svn: 185125
-rw-r--r--lld/lib/ReaderWriter/PECOFF/Atoms.cpp48
-rw-r--r--lld/lib/ReaderWriter/PECOFF/Atoms.h40
-rw-r--r--lld/lib/ReaderWriter/PECOFF/CMakeLists.txt1
3 files changed, 38 insertions, 51 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/Atoms.cpp b/lld/lib/ReaderWriter/PECOFF/Atoms.cpp
deleted file mode 100644
index 2fb1aa19aec..00000000000
--- a/lld/lib/ReaderWriter/PECOFF/Atoms.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-//===- lib/ReaderWriter/PECOFF/Atoms.cpp ----------------------------------===//
-//
-// The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Atoms.h"
-
-namespace lld {
-namespace coff {
-
-namespace {
-void addEdge(COFFDefinedAtom *a, COFFDefinedAtom *b,
- lld::Reference::Kind kind) {
- auto ref = new COFFReference(kind);
- ref->setTarget(b);
- a->addReference(std::unique_ptr<COFFReference>(ref));
-}
-
-void connectWithLayoutEdge(COFFDefinedAtom *a, COFFDefinedAtom *b) {
- addEdge(a, b, lld::Reference::kindLayoutAfter);
- addEdge(b, a, lld::Reference::kindLayoutBefore);
-}
-} // anonymous namespace
-
-/// Connect atoms with layout-{before,after} edges. It usually serves two
-/// purposes.
-///
-/// - To prevent atoms from being GC'ed (aka dead-stripped) if there is a
-/// reference to one of the atoms. In that case we want to emit all the
-/// atoms appeared in the same section, because the referenced "live" atom
-/// may reference other atoms in the same section. If we don't add layout
-/// edges between atoms, unreferenced atoms in the same section would be
-/// GC'ed.
-/// - To preserve the order of atmos. We want to emit the atoms in the
-/// same order as they appeared in the input object file.
-void connectAtomsWithLayoutEdge(std::vector<COFFDefinedAtom *> atoms) {
- if (atoms.size() < 2)
- return;
- for (auto it = atoms.begin(), e = atoms.end(); it + 1 != e; ++it)
- connectWithLayoutEdge(*it, *(it + 1));
-}
-
-} // namespace coff
-} // namespace lld
diff --git a/lld/lib/ReaderWriter/PECOFF/Atoms.h b/lld/lib/ReaderWriter/PECOFF/Atoms.h
index 5d20d210587..94799692603 100644
--- a/lld/lib/ReaderWriter/PECOFF/Atoms.h
+++ b/lld/lib/ReaderWriter/PECOFF/Atoms.h
@@ -21,8 +21,6 @@ using llvm::object::COFFObjectFile;
using llvm::object::coff_section;
using llvm::object::coff_symbol;
-void connectAtomsWithLayoutEdge(std::vector<COFFDefinedAtom *>);
-
/// A COFFReference represents relocation information for an atom. For
/// example, if atom X has a reference to atom Y with offsetInAtom=8, that
/// means that the address starting at 8th byte of the content of atom X needs
@@ -201,5 +199,43 @@ private:
uint64_t _ordinal;
};
+//===----------------------------------------------------------------------===//
+//
+// Utility functions to handle layout edges.
+//
+//===----------------------------------------------------------------------===//
+
+template<typename T, typename U>
+void addLayoutEdge(T *a, U *b, lld::Reference::Kind kind) {
+ auto ref = new COFFReference(kind);
+ ref->setTarget(b);
+ a->addReference(std::unique_ptr<COFFReference>(ref));
+}
+
+template<typename T, typename U>
+void connectWithLayoutEdge(T *a, U *b) {
+ addLayoutEdge(a, b, lld::Reference::kindLayoutAfter);
+ addLayoutEdge(b, a, lld::Reference::kindLayoutBefore);
+}
+
+/// Connect atoms with layout-{before,after} edges. It usually serves two
+/// purposes.
+///
+/// - To prevent atoms from being GC'ed (aka dead-stripped) if there is a
+/// reference to one of the atoms. In that case we want to emit all the
+/// atoms appeared in the same section, because the referenced "live" atom
+/// may reference other atoms in the same section. If we don't add layout
+/// edges between atoms, unreferenced atoms in the same section would be
+/// GC'ed.
+/// - To preserve the order of atmos. We want to emit the atoms in the
+/// same order as they appeared in the input object file.
+template<typename T>
+void connectAtomsWithLayoutEdge(std::vector<T *> &atoms) {
+ if (atoms.size() < 2)
+ return;
+ for (auto it = atoms.begin(), e = atoms.end(); it + 1 != e; ++it)
+ connectWithLayoutEdge(*it, *(it + 1));
+}
+
} // namespace coff
} // namespace lld
diff --git a/lld/lib/ReaderWriter/PECOFF/CMakeLists.txt b/lld/lib/ReaderWriter/PECOFF/CMakeLists.txt
index ff0141e4d37..a10bf02093b 100644
--- a/lld/lib/ReaderWriter/PECOFF/CMakeLists.txt
+++ b/lld/lib/ReaderWriter/PECOFF/CMakeLists.txt
@@ -1,5 +1,4 @@
add_lld_library(lldPECOFF
- Atoms.cpp
PECOFFTargetInfo.cpp
ReaderCOFF.cpp
ReaderImportHeader.cpp
OpenPOWER on IntegriCloud