COFF: Simplify construction of safe SEH table. NFCI.

Instead of building intermediate sets of exception handlers for each
object file, just create one for the final output file.

Differential Revision: https://reviews.llvm.org/D40581

llvm-svn: 319244
This commit is contained in:
Peter Collingbourne 2017-11-28 22:50:53 +00:00
parent 1bc7b0e148
commit 24ca79c776
3 changed files with 12 additions and 25 deletions

View File

@ -116,7 +116,6 @@ void ObjFile::parse() {
// Read section and symbol tables.
initializeChunks();
initializeSymbols();
initializeSEH();
}
// We set SectionChunk pointers in the SparseChunks vector to this value
@ -153,7 +152,12 @@ SectionChunk *ObjFile::readSection(uint32_t SectionNumber,
fatal("getSectionName failed: #" + Twine(SectionNumber) + ": " +
EC.message());
if (Name == ".sxdata") {
SXData = Sec;
ArrayRef<uint8_t> Data;
COFFObj->getSectionContents(Sec, Data);
if (Data.size() % 4 != 0)
fatal(".sxdata must be an array of symbol table indices");
SXData = {reinterpret_cast<const ulittle32_t *>(Data.data()),
Data.size() / 4};
return nullptr;
}
if (Name == ".drectve") {
@ -370,20 +374,6 @@ Optional<Symbol *> ObjFile::createDefined(
return createRegular(Sym);
}
void ObjFile::initializeSEH() {
if (!SEHCompat || !SXData)
return;
ArrayRef<uint8_t> A;
COFFObj->getSectionContents(SXData, A);
if (A.size() % 4 != 0)
fatal(".sxdata must be an array of symbol table indices");
auto *I = reinterpret_cast<const ulittle32_t *>(A.data());
auto *E = reinterpret_cast<const ulittle32_t *>(A.data() + A.size());
for (; I != E; ++I)
if (Symbols[*I])
SEHandlers.insert(Symbols[*I]);
}
MachineTypes ObjFile::getMachineType() {
if (COFFObj)
return static_cast<MachineTypes>(COFFObj->getMachine());

View File

@ -127,9 +127,9 @@ public:
// COFF-specific and x86-only.
bool SEHCompat = false;
// The list of safe exception handlers listed in .sxdata section.
// The symbol table indexes of the safe exception handlers.
// COFF-specific and x86-only.
std::set<Symbol *> SEHandlers;
ArrayRef<llvm::support::ulittle32_t> SXData;
// Pointer to the PDB module descriptor builder. Various debug info records
// will reference object files by "module index", which is here. Things like
@ -140,7 +140,6 @@ public:
private:
void initializeChunks();
void initializeSymbols();
void initializeSEH();
SectionChunk *
readSection(uint32_t SectionNumber,
@ -158,7 +157,6 @@ private:
Symbol *createUndefined(COFFSymbolRef Sym);
std::unique_ptr<COFFObjectFile> COFFObj;
const coff_section *SXData = nullptr;
// List of all chunks defined by this file. This includes both section
// chunks and non-section chunks for common symbols.

View File

@ -799,11 +799,10 @@ void Writer::createSEHTable(OutputSection *RData) {
for (ObjFile *File : ObjFile::Instances) {
if (!File->SEHCompat)
return;
for (Symbol *B : File->SEHandlers) {
// Make sure the handler is still live.
if (B->isLive())
Handlers.insert(cast<Defined>(B));
}
for (uint32_t I : File->SXData)
if (Symbol *B = File->getSymbol(I))
if (B->isLive())
Handlers.insert(cast<Defined>(B));
}
if (Handlers.empty())