From d03eeafd9fc9e96df1f6b13dd55e8864dd6b3291 Mon Sep 17 00:00:00 2001 From: Scott Michel Date: Fri, 7 Nov 2008 04:36:25 +0000 Subject: [PATCH] Teach CellSPU about ELF sections and new section emitter classes. NB: This is likely to need more work. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58832 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/CellSPU/SPUTargetAsmInfo.cpp | 46 +++++++++++++-------------------- lib/Target/CellSPU/SPUTargetAsmInfo.h | 33 ++++++++++++++++++----- lib/Target/CellSPU/SPUTargetMachine.cpp | 2 +- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/lib/Target/CellSPU/SPUTargetAsmInfo.cpp b/lib/Target/CellSPU/SPUTargetAsmInfo.cpp index 89ab0e175af..9f62a28c0d0 100644 --- a/lib/Target/CellSPU/SPUTargetAsmInfo.cpp +++ b/lib/Target/CellSPU/SPUTargetAsmInfo.cpp @@ -14,38 +14,28 @@ #include "SPUTargetAsmInfo.h" #include "SPUTargetMachine.h" #include "llvm/Function.h" +#include "llvm/Support/Compiler.h" + using namespace llvm; -SPUTargetAsmInfo::SPUTargetAsmInfo(const SPUTargetMachine &TM) - : TargetAsmInfo(TM) { +SPULinuxTargetAsmInfo::SPULinuxTargetAsmInfo(const SPUTargetMachine &TM) : + SPUTargetAsmInfo(TM) { PCSymbol = "."; CommentString = "#"; GlobalPrefix = ""; PrivateGlobalPrefix = ".L"; - ZeroDirective = "\t.space\t"; - SetDirective = "\t.set"; - Data64bitsDirective = "\t.quad\t"; - AlignmentIsInBytes = false; - SwitchToSectionDirective = ".section\t"; - ConstantPoolSection = "\t.const\t"; - JumpTableDataSection = ".const"; - CStringSection = "\t.cstring"; - StaticCtorsSection = ".mod_init_func"; - StaticDtorsSection = ".mod_term_func"; - InlineAsmStart = "# InlineAsm Start"; - InlineAsmEnd = "# InlineAsm End"; - - NeedsSet = true; - /* FIXME: Need actual assembler syntax for DWARF info: */ - DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug"; - DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug"; - DwarfLineSection = ".section __DWARF,__debug_line,regular,debug"; - DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug"; - DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug"; - DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug"; - DwarfStrSection = ".section __DWARF,__debug_str,regular,debug"; - DwarfLocSection = ".section __DWARF,__debug_loc,regular,debug"; - DwarfARangesSection = ".section __DWARF,__debug_aranges,regular,debug"; - DwarfRangesSection = ".section __DWARF,__debug_ranges,regular,debug"; - DwarfMacInfoSection = ".section __DWARF,__debug_macinfo,regular,debug"; } + +/// PreferredEHDataFormat - This hook allows the target to select data +/// format used for encoding pointers in exception handling data. Reason is +/// 0 for data, 1 for code labels, 2 for function pointers. Global is true +/// if the symbol can be relocated. +unsigned +SPULinuxTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, + bool Global) const { + // We really need to write something here. + return TargetAsmInfo::PreferredEHDataFormat(Reason, Global); +} + +// Instantiate default implementation. +TEMPLATE_INSTANTIATION(class SPUTargetAsmInfo); diff --git a/lib/Target/CellSPU/SPUTargetAsmInfo.h b/lib/Target/CellSPU/SPUTargetAsmInfo.h index 01036bc8c92..d10a5654059 100644 --- a/lib/Target/CellSPU/SPUTargetAsmInfo.h +++ b/lib/Target/CellSPU/SPUTargetAsmInfo.h @@ -11,20 +11,41 @@ // //===----------------------------------------------------------------------===// -#ifndef PPCTARGETASMINFO_H -#define PPCTARGETASMINFO_H +#ifndef SPUTARGETASMINFO_H +#define SPUTARGETASMINFO_H #include "llvm/Target/TargetAsmInfo.h" +#include "llvm/Target/ELFTargetAsmInfo.h" +#include "SPUTargetMachine.h" +#include "SPUSubtarget.h" namespace llvm { // Forward declaration. class SPUTargetMachine; + + template + struct SPUTargetAsmInfo : public BaseTAI { + explicit SPUTargetAsmInfo(const SPUTargetMachine &TM): + BaseTAI(TM) { + /* (unused today) + * const SPUSubtarget *Subtarget = &TM.getSubtarget(); */ - struct SPUTargetAsmInfo : public TargetAsmInfo { - SPUTargetAsmInfo(const SPUTargetMachine &TM); + BaseTAI::ZeroDirective = "\t.space\t"; + BaseTAI::SetDirective = "\t.set"; + BaseTAI::Data64bitsDirective = "\t.quad\t"; + BaseTAI::AlignmentIsInBytes = false; + BaseTAI::LCOMMDirective = "\t.lcomm\t"; + BaseTAI::InlineAsmStart = "# InlineAsm Start"; + BaseTAI::InlineAsmEnd = "# InlineAsm End"; + } + }; + + struct SPULinuxTargetAsmInfo : public SPUTargetAsmInfo { + explicit SPULinuxTargetAsmInfo(const SPUTargetMachine &TM); + virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, + bool Global) const; }; - } // namespace llvm -#endif +#endif /* SPUTARGETASMINFO_H */ diff --git a/lib/Target/CellSPU/SPUTargetMachine.cpp b/lib/Target/CellSPU/SPUTargetMachine.cpp index 7afe6fa831d..5e225844dbb 100644 --- a/lib/Target/CellSPU/SPUTargetMachine.cpp +++ b/lib/Target/CellSPU/SPUTargetMachine.cpp @@ -36,7 +36,7 @@ SPUFrameInfo::getCalleeSaveSpillSlots(unsigned &NumEntries) const { const TargetAsmInfo * SPUTargetMachine::createTargetAsmInfo() const { - return new SPUTargetAsmInfo(*this); + return new SPULinuxTargetAsmInfo(*this); } unsigned -- 2.11.0