Files
clang-p2996/lld/lib/ReaderWriter/ELF/ArrayOrderPass.cpp
Shankar Easwaran 2bc24928d3 [PassManager] add ReaderWriter{Native,YAML} to the Driver.
Enable this for the following flavors

a) core
b) gnu
c) darwin

Its disabled for the flavor PECOFF. Convenient markers are added with FIXME
comments in the Driver that would be removed and code removed from each flavor.

llvm-svn: 193585
2013-10-29 05:12:14 +00:00

45 lines
1.5 KiB
C++

//===- lib/ReaderWriter/ELF/ArrayOrderPass.cpp ----------------------------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "ArrayOrderPass.h"
#include <algorithm>
namespace lld {
namespace elf {
void ArrayOrderPass::perform(std::unique_ptr<MutableFile> &f) {
auto definedAtoms = f->definedAtoms();
std::stable_sort(definedAtoms.begin(), definedAtoms.end(),
[](const DefinedAtom *left, const DefinedAtom *right) {
if (left->sectionChoice() != DefinedAtom::sectionCustomRequired ||
right->sectionChoice() != DefinedAtom::sectionCustomRequired)
return false;
StringRef leftSec = left->customSectionName();
StringRef rightSec = right->customSectionName();
// Both sections start with the same array type.
if (!(leftSec.startswith(".init_array") &&
rightSec.startswith(".init_array")) &&
!(leftSec.startswith(".fini_array") &&
rightSec.startswith(".fini_array")))
return false;
// Get priortiy
uint16_t leftPriority = 0;
leftSec.rsplit('.').second.getAsInteger(10, leftPriority);
uint16_t rightPriority = 0;
rightSec.rsplit('.').second.getAsInteger(10, rightPriority);
return leftPriority < rightPriority;
});
}
} // end namespace elf
} // end namespace lld