diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-07-27 16:45:59 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-07-27 16:45:59 +0000 | 
| commit | 1814e81e17f15afc73adb7e5b4ddc044f16b02c5 (patch) | |
| tree | df317cec89e5640d75a7281902906c8cf180057f /llvm | |
| parent | ff1f401f9be84723593e22d9df16029a4037a8fa (diff) | |
| download | bcm5719-llvm-1814e81e17f15afc73adb7e5b4ddc044f16b02c5.tar.gz bcm5719-llvm-1814e81e17f15afc73adb7e5b4ddc044f16b02c5.zip  | |
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
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Target/COFFTargetAsmInfo.h | 30 | ||||
| -rw-r--r-- | llvm/include/llvm/Target/ELFTargetAsmInfo.h | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/COFFTargetAsmInfo.cpp | 76 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86TargetAsmInfo.cpp | 60 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86TargetAsmInfo.h | 14 | 
5 files changed, 113 insertions, 68 deletions
diff --git a/llvm/include/llvm/Target/COFFTargetAsmInfo.h b/llvm/include/llvm/Target/COFFTargetAsmInfo.h new file mode 100644 index 00000000000..45eef01d2e4 --- /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<char> &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 1f7a21e30fe..a0cbc8e5455 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 00000000000..5d080b425f7 --- /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<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()); +} diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp index 94529ea8ceb..40c46bb1de0 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<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 = ";"; diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.h b/llvm/lib/Target/X86/X86TargetAsmInfo.h index d9716809767..0847660f2e5 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<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);  | 

