From 1814e81e17f15afc73adb7e5b4ddc044f16b02c5 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 27 Jul 2009 16:45:59 +0000 Subject: [PATCH] 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 --- llvm/include/llvm/Target/COFFTargetAsmInfo.h | 30 +++++++++++ llvm/include/llvm/Target/ELFTargetAsmInfo.h | 1 - llvm/lib/Target/COFFTargetAsmInfo.cpp | 76 ++++++++++++++++++++++++++++ llvm/lib/Target/X86/X86TargetAsmInfo.cpp | 60 +--------------------- llvm/lib/Target/X86/X86TargetAsmInfo.h | 14 +++-- 5 files changed, 113 insertions(+), 68 deletions(-) create mode 100644 llvm/include/llvm/Target/COFFTargetAsmInfo.h create mode 100644 llvm/lib/Target/COFFTargetAsmInfo.cpp diff --git a/llvm/include/llvm/Target/COFFTargetAsmInfo.h b/llvm/include/llvm/Target/COFFTargetAsmInfo.h new file mode 100644 index 0000000..45eef01 --- /dev/null +++ b/llvm/include/llvm/Target/COFFTargetAsmInfo.h @@ -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 &Str) const; + }; +} + + +#endif // LLVM_ELF_TARGET_ASM_INFO_H diff --git a/llvm/include/llvm/Target/ELFTargetAsmInfo.h b/llvm/include/llvm/Target/ELFTargetAsmInfo.h index 1f7a21e..a0cbc8e 100644 --- a/llvm/include/llvm/Target/ELFTargetAsmInfo.h +++ b/llvm/include/llvm/Target/ELFTargetAsmInfo.h @@ -18,7 +18,6 @@ #include "llvm/Target/TargetAsmInfo.h" namespace llvm { - class GlobalValue; struct ELFTargetAsmInfo : public TargetAsmInfo { ELFTargetAsmInfo(const TargetMachine &TM); diff --git a/llvm/lib/Target/COFFTargetAsmInfo.cpp b/llvm/lib/Target/COFFTargetAsmInfo.cpp new file mode 100644 index 0000000..5d080b4 --- /dev/null +++ b/llvm/lib/Target/COFFTargetAsmInfo.cpp @@ -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 &Str) const { + // FIXME: Inefficient. + std::string Res = ",\""; + if (Kind.isText()) + Res += 'x'; + if (Kind.isWriteable()) + Res += 'w'; + Res += "\""; + + Str.append(Res.begin(), Res.end()); +} diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp index 94529ea..40c46bb 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp @@ -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 &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(TM) { GlobalPrefix = "_"; CommentString = ";"; diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.h b/llvm/lib/Target/X86/X86TargetAsmInfo.h index d971680..0847660 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.h +++ b/llvm/lib/Target/X86/X86TargetAsmInfo.h @@ -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 { + explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM) : + X86TargetAsmInfo(TM) {} virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; - virtual const char * - getSectionPrefixForUniqueGlobal(SectionKind kind) const; - - virtual void getSectionFlagsAsString(SectionKind Kind, - SmallVectorImpl &Str) const; }; + struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo { explicit X86WinTargetAsmInfo(const X86TargetMachine &TM); -- 2.7.4