Revert 277594, it caused PR28827

llvm-svn: 277599
This commit is contained in:
Nico Weber 2016-08-03 14:37:57 +00:00
parent 91bab5364e
commit 2e36772caf
4 changed files with 19 additions and 16 deletions

View File

@ -64,7 +64,7 @@ std::string InputFile::getShortName() {
void ArchiveFile::parse() { void ArchiveFile::parse() {
// Parse a MemoryBufferRef as an archive file. // Parse a MemoryBufferRef as an archive file.
File = check(Archive::create(MB), "failed to parse static library"); File = check(Archive::create(MB), getShortName());
// Allocate a buffer for Lazy objects. // Allocate a buffer for Lazy objects.
size_t NumSyms = File->getNumberOfSymbols(); size_t NumSyms = File->getNumberOfSymbols();
@ -81,7 +81,7 @@ void ArchiveFile::parse() {
for (auto &Child : File->children(Err)) for (auto &Child : File->children(Err))
Seen[Child.getChildOffset()].clear(); Seen[Child.getChildOffset()].clear();
if (Err) if (Err)
fatal(Err, "failed to parse static library"); fatal(Err, getShortName());
} }
// Returns a buffer pointing to a member file containing a given symbol. // Returns a buffer pointing to a member file containing a given symbol.
@ -109,13 +109,13 @@ MemoryBufferRef ArchiveFile::getMember(const Archive::Symbol *Sym) {
void ObjectFile::parse() { void ObjectFile::parse() {
// Parse a memory buffer as a COFF file. // Parse a memory buffer as a COFF file.
std::unique_ptr<Binary> Bin = std::unique_ptr<Binary> Bin =
check(createBinary(MB), "failed to parse object file"); check(createBinary(MB), getShortName());
if (auto *Obj = dyn_cast<COFFObjectFile>(Bin.get())) { if (auto *Obj = dyn_cast<COFFObjectFile>(Bin.get())) {
Bin.release(); Bin.release();
COFFObj.reset(Obj); COFFObj.reset(Obj);
} else { } else {
fatal(getName() + " is not a COFF file"); fatal(getShortName() + " is not a COFF file");
} }
// Read section and symbol tables. // Read section and symbol tables.
@ -169,7 +169,7 @@ void ObjectFile::initializeSymbols() {
for (uint32_t I = 0; I < NumSymbols; ++I) { for (uint32_t I = 0; I < NumSymbols; ++I) {
// Get a COFFSymbolRef object. // Get a COFFSymbolRef object.
COFFSymbolRef Sym = COFFSymbolRef Sym =
check(COFFObj->getSymbol(I), "broken object file: " + getName()); check(COFFObj->getSymbol(I), "broken object file: " + getShortName());
const void *AuxP = nullptr; const void *AuxP = nullptr;
if (Sym.getNumberOfAuxSymbols()) if (Sym.getNumberOfAuxSymbols())
@ -231,12 +231,12 @@ Defined *ObjectFile::createDefined(COFFSymbolRef Sym, const void *AuxP,
// Reserved sections numbers don't have contents. // Reserved sections numbers don't have contents.
if (llvm::COFF::isReservedSectionNumber(SectionNumber)) if (llvm::COFF::isReservedSectionNumber(SectionNumber))
fatal("broken object file: " + getName()); fatal("broken object file: " + getShortName());
// This symbol references a section which is not present in the section // This symbol references a section which is not present in the section
// header. // header.
if ((uint32_t)SectionNumber >= SparseChunks.size()) if ((uint32_t)SectionNumber >= SparseChunks.size())
fatal("broken object file: " + getName()); fatal("broken object file: " + getShortName());
// Nothing else to do without a section chunk. // Nothing else to do without a section chunk.
auto *SC = cast_or_null<SectionChunk>(SparseChunks[SectionNumber]); auto *SC = cast_or_null<SectionChunk>(SparseChunks[SectionNumber]);

View File

@ -218,8 +218,9 @@ template <class ELFT> void LinkerScript<ELFT>::filter() {
} }
} }
template <class ELFT> void LinkerScript<ELFT>::assignAddresses() { template <class ELFT>
ArrayRef<OutputSectionBase<ELFT> *> Sections = *OutputSections; void LinkerScript<ELFT>::assignAddresses(
ArrayRef<OutputSectionBase<ELFT> *> Sections) {
// Orphan sections are sections present in the input files which // Orphan sections are sections present in the input files which
// are not explicitly placed into the output file by the linker script. // are not explicitly placed into the output file by the linker script.
// We place orphan sections at end of file. // We place orphan sections at end of file.
@ -288,8 +289,8 @@ template <class ELFT> void LinkerScript<ELFT>::assignAddresses() {
} }
template <class ELFT> template <class ELFT>
std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() { std::vector<PhdrEntry<ELFT>>
ArrayRef<OutputSectionBase<ELFT> *> Sections = *OutputSections; LinkerScript<ELFT>::createPhdrs(ArrayRef<OutputSectionBase<ELFT> *> Sections) {
std::vector<PhdrEntry<ELFT>> Ret; std::vector<PhdrEntry<ELFT>> Ret;
for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) { for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) {

View File

@ -133,11 +133,12 @@ public:
void createSections(std::vector<OutputSectionBase<ELFT> *> *Out, void createSections(std::vector<OutputSectionBase<ELFT> *> *Out,
OutputSectionFactory<ELFT> &Factory); OutputSectionFactory<ELFT> &Factory);
std::vector<PhdrEntry<ELFT>> createPhdrs(); std::vector<PhdrEntry<ELFT>>
createPhdrs(ArrayRef<OutputSectionBase<ELFT> *> S);
ArrayRef<uint8_t> getFiller(StringRef Name); ArrayRef<uint8_t> getFiller(StringRef Name);
bool shouldKeep(InputSectionBase<ELFT> *S); bool shouldKeep(InputSectionBase<ELFT> *S);
void assignAddresses(); void assignAddresses(ArrayRef<OutputSectionBase<ELFT> *> S);
int compareSections(StringRef A, StringRef B); int compareSections(StringRef A, StringRef B);
void addScriptedSymbols(); void addScriptedSymbols();
bool hasPhdrsCommands(); bool hasPhdrsCommands();

View File

@ -245,11 +245,12 @@ template <class ELFT> void Writer<ELFT>::run() {
if (Config->Relocatable) { if (Config->Relocatable) {
assignFileOffsets(); assignFileOffsets();
} else { } else {
Phdrs = Script<ELFT>::X->hasPhdrsCommands() ? Script<ELFT>::X->createPhdrs() Phdrs = Script<ELFT>::X->hasPhdrsCommands()
? Script<ELFT>::X->createPhdrs(OutputSections)
: createPhdrs(); : createPhdrs();
fixHeaders(); fixHeaders();
if (ScriptConfig->HasContents) { if (ScriptConfig->HasContents) {
Script<ELFT>::X->assignAddresses(); Script<ELFT>::X->assignAddresses(OutputSections);
} else { } else {
fixSectionAlignments(); fixSectionAlignments();
assignAddresses(); assignAddresses();