mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 07:59:57 +00:00
7521964d28
This starts merging MCSection and MCSectionData. There are a few issues with the current split between MCSection and MCSectionData. * It optimizes the the not as important case. We want the production of .o files to be really fast, but the split puts the information used for .o emission in a separate data structure. * The ELF/COFF/MachO hierarchy is not represented in MCSectionData, leading to some ad-hoc ways to represent the various flags. * It makes it harder to remember where each item is. The attached patch starts merging the two by moving the alignment from MCSectionData to MCSection. Most of the patch is actually just dropping 'const', since MCSectionData is mutable, but MCSection was not. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237936 91177308-0d34-0410-b5e6-96231b3b80d8
80 lines
2.9 KiB
C++
80 lines
2.9 KiB
C++
//===- lib/MC/MCWinEH.cpp - Windows EH implementation ---------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCObjectFileInfo.h"
|
|
#include "llvm/MC/MCSectionCOFF.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/MC/MCWinEH.h"
|
|
#include "llvm/Support/COFF.h"
|
|
|
|
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::getDataRel());
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
}
|
|
|