mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
make COFF work like ELF and macho, by splitting out into its own
header even though there is only one COFF target. llvm-svn: 77204
This commit is contained in:
parent
90a2885055
commit
12c25bacbd
30
include/llvm/Target/COFFTargetAsmInfo.h
Normal file
30
include/llvm/Target/COFFTargetAsmInfo.h
Normal file
@ -0,0 +1,30 @@
|
||||
//===-- COFFTargetAsmInfo.h - 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.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_COFF_TARGET_ASM_INFO_H
|
||||
#define LLVM_COFF_TARGET_ASM_INFO_H
|
||||
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
class COFFTargetAsmInfo : public TargetAsmInfo {
|
||||
protected:
|
||||
explicit COFFTargetAsmInfo(const TargetMachine &TM);
|
||||
public:
|
||||
|
||||
virtual const char *
|
||||
getSectionPrefixForUniqueGlobal(SectionKind kind) const;
|
||||
|
||||
virtual void getSectionFlagsAsString(SectionKind Kind,
|
||||
SmallVectorImpl<char> &Str) const;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif // LLVM_ELF_TARGET_ASM_INFO_H
|
@ -18,7 +18,6 @@
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
class GlobalValue;
|
||||
|
||||
struct ELFTargetAsmInfo : public TargetAsmInfo {
|
||||
ELFTargetAsmInfo(const TargetMachine &TM);
|
||||
|
76
lib/Target/COFFTargetAsmInfo.cpp
Normal file
76
lib/Target/COFFTargetAsmInfo.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
//===-- 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\"";
|
||||
}
|
||||
|
||||
const char *COFFTargetAsmInfo::
|
||||
getSectionPrefixForUniqueGlobal(SectionKind Kind) const {
|
||||
if (Kind.isText())
|
||||
return ".text$linkonce";
|
||||
if (Kind.isWriteable())
|
||||
return ".data$linkonce";
|
||||
return ".rdata$linkonce";
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
@ -188,42 +188,6 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
}
|
||||
}
|
||||
|
||||
X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM):
|
||||
X86GenericTargetAsmInfo(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\"";
|
||||
}
|
||||
|
||||
unsigned
|
||||
X86COFFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
@ -263,32 +227,10 @@ X86COFFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
return DW_EH_PE_absptr;
|
||||
}
|
||||
|
||||
const char *X86COFFTargetAsmInfo::
|
||||
getSectionPrefixForUniqueGlobal(SectionKind Kind) const {
|
||||
if (Kind.isText())
|
||||
return ".text$linkonce";
|
||||
if (Kind.isWriteable())
|
||||
return ".data$linkonce";
|
||||
return ".rdata$linkonce";
|
||||
}
|
||||
|
||||
|
||||
|
||||
void X86COFFTargetAsmInfo::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());
|
||||
}
|
||||
|
||||
X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
|
||||
X86GenericTargetAsmInfo(TM) {
|
||||
X86TargetAsmInfo<TargetAsmInfo>(TM) {
|
||||
GlobalPrefix = "_";
|
||||
CommentString = ";";
|
||||
|
||||
|
@ -16,8 +16,9 @@
|
||||
|
||||
#include "X86TargetMachine.h"
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
#include "llvm/Target/ELFTargetAsmInfo.h"
|
||||
#include "llvm/Target/COFFTargetAsmInfo.h"
|
||||
#include "llvm/Target/DarwinTargetAsmInfo.h"
|
||||
#include "llvm/Target/ELFTargetAsmInfo.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
namespace llvm {
|
||||
@ -49,16 +50,13 @@ namespace llvm {
|
||||
bool Global) const;
|
||||
};
|
||||
|
||||
struct X86COFFTargetAsmInfo : public X86GenericTargetAsmInfo {
|
||||
explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM);
|
||||
struct X86COFFTargetAsmInfo : public X86TargetAsmInfo<COFFTargetAsmInfo> {
|
||||
explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM) :
|
||||
X86TargetAsmInfo<COFFTargetAsmInfo>(TM) {}
|
||||
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
bool Global) const;
|
||||
virtual const char *
|
||||
getSectionPrefixForUniqueGlobal(SectionKind kind) const;
|
||||
|
||||
virtual void getSectionFlagsAsString(SectionKind Kind,
|
||||
SmallVectorImpl<char> &Str) const;
|
||||
};
|
||||
|
||||
|
||||
struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo {
|
||||
explicit X86WinTargetAsmInfo(const X86TargetMachine &TM);
|
||||
|
Loading…
Reference in New Issue
Block a user