diff options
| author | Rui Ueyama <ruiu@google.com> | 2013-06-28 03:41:07 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2013-06-28 03:41:07 +0000 |
| commit | 1a54aad50b3547e025f4e553d548ae9e5cd7d783 (patch) | |
| tree | 30f958687f99aabe22073eb99aee181994e3a884 | |
| parent | fbfdced30ff483dd8e4dd74b811122a63da06611 (diff) | |
| download | bcm5719-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.cpp | 48 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/Atoms.h | 40 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/CMakeLists.txt | 1 |
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 |

