diff options
author | Reid Kleckner <rnk@google.com> | 2016-05-02 23:22:18 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2016-05-02 23:22:18 +0000 |
commit | 97837b7b091621537854a753942ce504560dee45 (patch) | |
tree | 60abc8f455f43edab5d3d423b2439e01c5f33718 /llvm/lib/MC/MCWinEH.cpp | |
parent | 9102fc20f8e3d89b27d91a23a9a50ae32bf403c4 (diff) | |
download | bcm5719-llvm-97837b7b091621537854a753942ce504560dee45.tar.gz bcm5719-llvm-97837b7b091621537854a753942ce504560dee45.zip |
[MC] Create unique .pdata sections for every .text section
Summary:
This adds a unique ID to the COFF section uniquing map, similar to the
one we have for ELF. The unique id is not currently exposed via the
assembler because we don't have a use case for it yet. Users generally
create .pdata with the .seh_* family of directives, and the assembler
internally needs to produce .pdata and .xdata sections corresponding to
the code section.
The association between .text sections and the assembler-created .xdata
and .pdata sections is maintained as an ID field of MCSectionCOFF. The
CFI-related sections are created with the given unique ID, so if more
code is added to the same text section, we can find and reuse the CFI
sections that were already created.
Reviewers: majnemer, rafael
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D19376
llvm-svn: 268331
Diffstat (limited to 'llvm/lib/MC/MCWinEH.cpp')
-rw-r--r-- | llvm/lib/MC/MCWinEH.cpp | 55 |
1 files changed, 1 insertions, 54 deletions
diff --git a/llvm/lib/MC/MCWinEH.cpp b/llvm/lib/MC/MCWinEH.cpp index 83af203c7ac..21a913999f6 100644 --- a/llvm/lib/MC/MCWinEH.cpp +++ b/llvm/lib/MC/MCWinEH.cpp @@ -19,60 +19,7 @@ namespace llvm { namespace WinEH { -/// We can't have one section for all .pdata or .xdata because the Microsoft -/// linker seems to want all code relocations to refer to the same object file -/// section. If the code described is comdat, create a new comdat section -/// associated with that comdat. If the code described is not in the main .text -/// section, make a new section for it. Otherwise use the main unwind info -/// section. -static MCSection *getUnwindInfoSection(StringRef SecName, - MCSectionCOFF *UnwindSec, - const MCSymbol *Function, - MCContext &Context) { - if (Function && Function->isInSection()) { - // If Function is in a COMDAT, get or create an unwind info section in that - // COMDAT group. - const MCSectionCOFF *FunctionSection = - cast<MCSectionCOFF>(&Function->getSection()); - if (FunctionSection->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { - return Context.getAssociativeCOFFSection( - UnwindSec, FunctionSection->getCOMDATSymbol()); - } - - // If Function is in a section other than .text, create a new .pdata section. - // Otherwise use the plain .pdata section. - if (const auto *Section = dyn_cast<MCSectionCOFF>(FunctionSection)) { - StringRef CodeSecName = Section->getSectionName(); - if (CodeSecName == ".text") - return UnwindSec; - - if (CodeSecName.startswith(".text$")) - CodeSecName = CodeSecName.substr(6); - - return Context.getCOFFSection((SecName + Twine('$') + CodeSecName).str(), - COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | - COFF::IMAGE_SCN_MEM_READ, - SectionKind::getData()); - } - } - - return UnwindSec; - -} - -MCSection *UnwindEmitter::getPDataSection(const MCSymbol *Function, - MCContext &Context) { - MCSectionCOFF *PData = - cast<MCSectionCOFF>(Context.getObjectFileInfo()->getPDataSection()); - return getUnwindInfoSection(".pdata", PData, Function, Context); -} - -MCSection *UnwindEmitter::getXDataSection(const MCSymbol *Function, - MCContext &Context) { - MCSectionCOFF *XData = - cast<MCSectionCOFF>(Context.getObjectFileInfo()->getXDataSection()); - return getUnwindInfoSection(".xdata", XData, Function, Context); -} +UnwindEmitter::~UnwindEmitter() {} } } |