switch MCSectionCOFF from a syntactic to semantic representation,

patch by Peter Housel!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103267 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2010-05-07 17:17:41 +00:00
parent 5fa680d397
commit eb40a0fd98
9 changed files with 277 additions and 120 deletions

View File

@ -22,6 +22,7 @@
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Target/Mangler.h"
#include "llvm/Target/TargetData.h"
@ -794,89 +795,147 @@ unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
// COFF
//===----------------------------------------------------------------------===//
typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
TargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() {
delete (COFFUniqueMapTy*)UniquingMap;
}
const MCSection *TargetLoweringObjectFileCOFF::
getCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const {
// Create the map if it doesn't already exist.
if (UniquingMap == 0)
UniquingMap = new COFFUniqueMapTy();
COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap;
// Do the lookup, if we have a hit, return it.
const MCSectionCOFF *&Entry = Map[Name];
if (Entry) return Entry;
return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext());
}
void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
if (UniquingMap != 0)
((COFFUniqueMapTy*)UniquingMap)->clear();
TargetLoweringObjectFile::Initialize(Ctx, TM);
TextSection = getCOFFSection("\t.text", true, SectionKind::getText());
DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel());
TextSection =
getContext().getCOFFSection(".text",
MCSectionCOFF::IMAGE_SCN_CNT_CODE |
MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getText());
DataSection =
getContext().getCOFFSection(".data",
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ |
MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
SectionKind::getDataRel());
ReadOnlySection =
getContext().getCOFFSection(".rdata",
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getReadOnly());
StaticCtorSection =
getCOFFSection(".ctors", false, SectionKind::getDataRel());
getContext().getCOFFSection(".ctors",
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ |
MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
SectionKind::getDataRel());
StaticDtorSection =
getCOFFSection(".dtors", false, SectionKind::getDataRel());
getContext().getCOFFSection(".dtors",
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ |
MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
SectionKind::getDataRel());
// FIXME: We're emitting LSDA info into a readonly section on COFF, even
// though it contains relocatable pointers. In PIC mode, this is probably a
// big runtime hit for C++ apps. Either the contents of the LSDA need to be
// adjusted or this should be a data section.
LSDASection =
getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly());
getContext().getCOFFSection(".gcc_except_table",
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getReadOnly());
EHFrameSection =
getCOFFSection(".eh_frame", false, SectionKind::getDataRel());
getContext().getCOFFSection(".eh_frame",
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ |
MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
SectionKind::getDataRel());
// Debug info.
// FIXME: Don't use 'directive' mode here.
DwarfAbbrevSection =
getCOFFSection("\t.section\t.debug_abbrev,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_abbrev",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfInfoSection =
getCOFFSection("\t.section\t.debug_info,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_info",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfLineSection =
getCOFFSection("\t.section\t.debug_line,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_line",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfFrameSection =
getCOFFSection("\t.section\t.debug_frame,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_frame",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfPubNamesSection =
getCOFFSection("\t.section\t.debug_pubnames,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_pubnames",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfPubTypesSection =
getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_pubtypes",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfStrSection =
getCOFFSection("\t.section\t.debug_str,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_str",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfLocSection =
getCOFFSection("\t.section\t.debug_loc,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_loc",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfARangesSection =
getCOFFSection("\t.section\t.debug_aranges,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_aranges",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfRangesSection =
getCOFFSection("\t.section\t.debug_ranges,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_ranges",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DwarfMacroInfoSection =
getCOFFSection("\t.section\t.debug_macinfo,\"dr\"",
true, SectionKind::getMetadata());
getContext().getCOFFSection(".debug_macinfo",
MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
MCSectionCOFF::IMAGE_SCN_MEM_READ,
SectionKind::getMetadata());
DrectveSection =
getContext().getCOFFSection(".drectve",
MCSectionCOFF::IMAGE_SCN_LNK_INFO,
SectionKind::getMetadata());
}
static unsigned
getCOFFSectionFlags(SectionKind K) {
unsigned Flags = 0;
if (!K.isMetadata())
Flags |= MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE;
else if (K.isText())
Flags |=
MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
MCSectionCOFF::IMAGE_SCN_CNT_CODE;
else if (K.isReadOnly())
Flags |=
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ;
else if (K.isWriteable())
Flags |=
MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
MCSectionCOFF::IMAGE_SCN_MEM_READ |
MCSectionCOFF::IMAGE_SCN_MEM_WRITE;
return Flags;
}
const MCSection *TargetLoweringObjectFileCOFF::
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const {
return getCOFFSection(GV->getSection(), false, Kind);
return getContext().getCOFFSection(GV->getSection(),
getCOFFSectionFlags(Kind),
Kind);
}
static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
@ -900,7 +959,9 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
MCSymbol *Sym = Mang->getSymbol(GV);
Name.append(Sym->getName().begin(), Sym->getName().end());
return getCOFFSection(Name.str(), false, Kind);
return getContext().getCOFFSection(Name.str(),
getCOFFSectionFlags(Kind),
Kind);
}
if (Kind.isText())