mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 05:29:24 +00:00
objects in llvm.used (thanks Anton). Makes visible the magic 'l' prefix for symbols on Darwin which are to be passed through the assembler, then removed at linktime (previously all references to this had been hidden in the ObjC FE code, oh well). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55973 91177308-0d34-0410-b5e6-96231b3b80d8
169 lines
6.8 KiB
C++
169 lines
6.8 KiB
C++
//===-- PPCTargetAsmInfo.cpp - PPC 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 contains the declarations of the DarwinTargetAsmInfo properties.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "PPCTargetAsmInfo.h"
|
|
#include "PPCTargetMachine.h"
|
|
#include "llvm/Function.h"
|
|
#include "llvm/Support/Dwarf.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::dwarf;
|
|
|
|
PPCTargetAsmInfo::PPCTargetAsmInfo(const PPCTargetMachine &TM) {
|
|
bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
|
|
|
|
ZeroDirective = "\t.space\t";
|
|
SetDirective = "\t.set";
|
|
Data64bitsDirective = isPPC64 ? "\t.quad\t" : 0;
|
|
AlignmentIsInBytes = false;
|
|
LCOMMDirective = "\t.lcomm\t";
|
|
InlineAsmStart = "# InlineAsm Start";
|
|
InlineAsmEnd = "# InlineAsm End";
|
|
AssemblerDialect = TM.getSubtargetImpl()->getAsmFlavor();
|
|
}
|
|
|
|
PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM):
|
|
PPCTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) {
|
|
PCSymbol = ".";
|
|
CommentString = ";";
|
|
GlobalPrefix = "_";
|
|
PrivateGlobalPrefix = "L";
|
|
LessPrivateGlobalPrefix = "l";
|
|
StringConstantPrefix = "\1LC";
|
|
ConstantPoolSection = "\t.const\t";
|
|
JumpTableDataSection = ".const";
|
|
CStringSection = "\t.cstring";
|
|
FourByteConstantSection = "\t.literal4\n";
|
|
EightByteConstantSection = "\t.literal8\n";
|
|
ReadOnlySection = "\t.const\n";
|
|
if (TM.getRelocationModel() == Reloc::Static) {
|
|
StaticCtorsSection = ".constructor";
|
|
StaticDtorsSection = ".destructor";
|
|
} else {
|
|
StaticCtorsSection = ".mod_init_func";
|
|
StaticDtorsSection = ".mod_term_func";
|
|
}
|
|
SwitchToSectionDirective = "\t.section ";
|
|
UsedDirective = "\t.no_dead_strip\t";
|
|
WeakDefDirective = "\t.weak_definition ";
|
|
WeakRefDirective = "\t.weak_reference ";
|
|
HiddenDirective = "\t.private_extern ";
|
|
SupportsExceptionHandling = true;
|
|
NeedsIndirectEncoding = true;
|
|
NeedsSet = true;
|
|
BSSSection = 0;
|
|
|
|
DwarfEHFrameSection =
|
|
".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
|
|
DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
|
|
GlobalEHDirective = "\t.globl\t";
|
|
SupportsWeakOmittedEHFrame = false;
|
|
|
|
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";
|
|
|
|
// In non-PIC modes, emit a special label before jump tables so that the
|
|
// linker can perform more accurate dead code stripping.
|
|
if (TM.getRelocationModel() != Reloc::PIC_) {
|
|
// Emit a local label that is preserved until the linker runs.
|
|
JumpTableSpecialLabelPrefix = "l";
|
|
}
|
|
}
|
|
|
|
/// 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
|
|
PPCDarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
|
bool Global) const {
|
|
if (Reason == DwarfEncoding::Functions && Global)
|
|
return (DW_EH_PE_pcrel | DW_EH_PE_indirect | DW_EH_PE_sdata4);
|
|
else if (Reason == DwarfEncoding::CodeLabels || !Global)
|
|
return DW_EH_PE_pcrel;
|
|
else
|
|
return DW_EH_PE_absptr;
|
|
}
|
|
|
|
|
|
PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) :
|
|
PPCTargetAsmInfo(TM), ELFTargetAsmInfo(TM) {
|
|
CommentString = "#";
|
|
GlobalPrefix = "";
|
|
PrivateGlobalPrefix = "";
|
|
ConstantPoolSection = "\t.section .rodata.cst4\t";
|
|
JumpTableDataSection = ".section .rodata.cst4";
|
|
CStringSection = ".rodata.str";
|
|
StaticCtorsSection = ".section\t.ctors,\"aw\",@progbits";
|
|
StaticDtorsSection = ".section\t.dtors,\"aw\",@progbits";
|
|
UsedDirective = "\t# .no_dead_strip\t";
|
|
WeakRefDirective = "\t.weak\t";
|
|
BSSSection = "\t.section\t\".sbss\",\"aw\",@nobits";
|
|
|
|
// PPC/Linux normally uses named section for BSS.
|
|
BSSSection_ = getNamedSection("\t.bss",
|
|
SectionFlags::Writeable | SectionFlags::BSS,
|
|
/* Override */ true);
|
|
|
|
// Debug Information
|
|
AbsoluteDebugSectionOffsets = true;
|
|
SupportsDebugInformation = true;
|
|
DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"\",@progbits";
|
|
DwarfInfoSection = "\t.section\t.debug_info,\"\",@progbits";
|
|
DwarfLineSection = "\t.section\t.debug_line,\"\",@progbits";
|
|
DwarfFrameSection = "\t.section\t.debug_frame,\"\",@progbits";
|
|
DwarfPubNamesSection ="\t.section\t.debug_pubnames,\"\",@progbits";
|
|
DwarfPubTypesSection ="\t.section\t.debug_pubtypes,\"\",@progbits";
|
|
DwarfStrSection = "\t.section\t.debug_str,\"\",@progbits";
|
|
DwarfLocSection = "\t.section\t.debug_loc,\"\",@progbits";
|
|
DwarfARangesSection = "\t.section\t.debug_aranges,\"\",@progbits";
|
|
DwarfRangesSection = "\t.section\t.debug_ranges,\"\",@progbits";
|
|
DwarfMacInfoSection = "\t.section\t.debug_macinfo,\"\",@progbits";
|
|
|
|
ReadOnlySection = "\t.section\t.rodata";
|
|
FourByteConstantSection = "\t.section\t.rodata.cst4,\"aM\",@progbits,4";
|
|
EightByteConstantSection = "\t.section\t.rodata.cst8,\"aM\",@progbits,8";
|
|
SixteenByteConstantSection = "\t.section\t.rodata.cst16,\"aM\",@progbits,16";
|
|
PCSymbol = ".";
|
|
|
|
// Set up DWARF directives
|
|
HasLEB128 = true; // Target asm supports leb128 directives (little-endian)
|
|
|
|
// Exceptions handling
|
|
if (!TM.getSubtargetImpl()->isPPC64())
|
|
SupportsExceptionHandling = true;
|
|
AbsoluteEHSectionOffsets = false;
|
|
DwarfEHFrameSection = "\t.section\t.eh_frame,\"aw\",@progbits";
|
|
DwarfExceptionSection = "\t.section\t.gcc_except_table,\"a\",@progbits";
|
|
}
|
|
|
|
/// 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
|
|
PPCLinuxTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
|
bool Global) const {
|
|
// We really need to write something here.
|
|
return TargetAsmInfo::PreferredEHDataFormat(Reason, Global);
|
|
}
|