forked from OSchip/llvm-project
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:
parent
1bc7b0e148
commit
24ca79c776
|
@ -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());
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue