[PECOFF][Writer] Templatize connectAtomsWithLayoutEdge()

Templatize connectAtomsWithLayoutEdge() so that it can handle other types of
defined atoms.

llvm-svn: 185125
This commit is contained in:
Rui Ueyama 2013-06-28 03:41:07 +00:00
parent fbfdced30f
commit 1a54aad50b
3 changed files with 38 additions and 51 deletions

View File

@ -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

View File

@ -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

View File

@ -1,5 +1,4 @@
add_lld_library(lldPECOFF
Atoms.cpp
PECOFFTargetInfo.cpp
ReaderCOFF.cpp
ReaderImportHeader.cpp