[lld] r319244 - COFF: Simplify construction of safe SEH table. NFCI.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 28 14:50:53 PST 2017
Author: pcc
Date: Tue Nov 28 14:50:53 2017
New Revision: 319244
URL: http://llvm.org/viewvc/llvm-project?rev=319244&view=rev
Log:
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
Modified:
lld/trunk/COFF/InputFiles.cpp
lld/trunk/COFF/InputFiles.h
lld/trunk/COFF/Writer.cpp
Modified: lld/trunk/COFF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=319244&r1=319243&r2=319244&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.cpp (original)
+++ lld/trunk/COFF/InputFiles.cpp Tue Nov 28 14:50:53 2017
@@ -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(uint3
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::createDefine
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());
Modified: lld/trunk/COFF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.h?rev=319244&r1=319243&r2=319244&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.h (original)
+++ lld/trunk/COFF/InputFiles.h Tue Nov 28 14:50:53 2017
@@ -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.
Modified: lld/trunk/COFF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=319244&r1=319243&r2=319244&view=diff
==============================================================================
--- lld/trunk/COFF/Writer.cpp (original)
+++ lld/trunk/COFF/Writer.cpp Tue Nov 28 14:50:53 2017
@@ -799,11 +799,10 @@ void Writer::createSEHTable(OutputSectio
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())
More information about the llvm-commits
mailing list