mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 03:53:04 +02:00
674e5fa434
implementations that need it, rearrange ELFTAI. llvm-svn: 77236
110 lines
3.8 KiB
C++
110 lines
3.8 KiB
C++
//===-- COFFTargetAsmInfo.cpp - COFF asm properties -------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines target asm properties related what form asm statements
|
|
// should take in general on COFF-based targets
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Target/COFFTargetAsmInfo.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
using namespace llvm;
|
|
|
|
COFFTargetAsmInfo::COFFTargetAsmInfo(const TargetMachine &TM)
|
|
: TargetAsmInfo(TM) {
|
|
|
|
TextSection = getOrCreateSection("_text", true, SectionKind::Text);
|
|
DataSection = getOrCreateSection("_data", true, SectionKind::DataRel);
|
|
|
|
GlobalPrefix = "_";
|
|
LCOMMDirective = "\t.lcomm\t";
|
|
COMMDirectiveTakesAlignment = false;
|
|
HasDotTypeDotSizeDirective = false;
|
|
HasSingleParameterDotFile = false;
|
|
StaticCtorsSection = "\t.section .ctors,\"aw\"";
|
|
StaticDtorsSection = "\t.section .dtors,\"aw\"";
|
|
HiddenDirective = NULL;
|
|
PrivateGlobalPrefix = "L"; // Prefix for private global symbols
|
|
WeakRefDirective = "\t.weak\t";
|
|
SetDirective = "\t.set\t";
|
|
|
|
// Set up DWARF directives
|
|
HasLEB128 = true; // Target asm supports leb128 directives (little-endian)
|
|
AbsoluteDebugSectionOffsets = true;
|
|
AbsoluteEHSectionOffsets = false;
|
|
SupportsDebugInformation = true;
|
|
DwarfSectionOffsetDirective = "\t.secrel32\t";
|
|
DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"dr\"";
|
|
DwarfInfoSection = "\t.section\t.debug_info,\"dr\"";
|
|
DwarfLineSection = "\t.section\t.debug_line,\"dr\"";
|
|
DwarfFrameSection = "\t.section\t.debug_frame,\"dr\"";
|
|
DwarfPubNamesSection ="\t.section\t.debug_pubnames,\"dr\"";
|
|
DwarfPubTypesSection ="\t.section\t.debug_pubtypes,\"dr\"";
|
|
DwarfStrSection = "\t.section\t.debug_str,\"dr\"";
|
|
DwarfLocSection = "\t.section\t.debug_loc,\"dr\"";
|
|
DwarfARangesSection = "\t.section\t.debug_aranges,\"dr\"";
|
|
DwarfRangesSection = "\t.section\t.debug_ranges,\"dr\"";
|
|
DwarfMacroInfoSection = "\t.section\t.debug_macinfo,\"dr\"";
|
|
}
|
|
|
|
void COFFTargetAsmInfo::getSectionFlagsAsString(SectionKind Kind,
|
|
SmallVectorImpl<char> &Str) const {
|
|
// FIXME: Inefficient.
|
|
std::string Res = ",\"";
|
|
if (Kind.isText())
|
|
Res += 'x';
|
|
if (Kind.isWriteable())
|
|
Res += 'w';
|
|
Res += "\"";
|
|
|
|
Str.append(Res.begin(), Res.end());
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Move to AsmPrinter (mangler access).
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/GlobalVariable.h"
|
|
|
|
static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
|
|
if (Kind.isText())
|
|
return ".text$linkonce";
|
|
if (Kind.isWriteable())
|
|
return ".data$linkonce";
|
|
return ".rdata$linkonce";
|
|
}
|
|
|
|
const Section *
|
|
COFFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV,
|
|
SectionKind Kind) const {
|
|
assert(!Kind.isThreadLocal() && "Doesn't support TLS");
|
|
|
|
// If this global is linkonce/weak and the target handles this by emitting it
|
|
// into a 'uniqued' section name, create and return the section now.
|
|
if (Kind.isWeak()) {
|
|
const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
|
|
// FIXME: Use mangler interface (PR4584).
|
|
std::string Name = Prefix+GV->getNameStr();
|
|
return getOrCreateSection(Name.c_str(), false, Kind.getKind());
|
|
}
|
|
|
|
if (Kind.isText())
|
|
return getTextSection();
|
|
|
|
if (Kind.isBSS())
|
|
if (const Section *S = getBSSSection_())
|
|
return S;
|
|
|
|
if (Kind.isReadOnly())
|
|
if (const Section *S = getReadOnlySection())
|
|
return S;
|
|
|
|
return getDataSection();
|
|
}
|