mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-21 00:32:23 +00:00
671fa97a4b
on x86-64 linux. This causes no regressions on 32 bit linux and 32 bit ppc. More tests pass on 64 bit ppc with no regressions. I didn't turn on eh on 64 bit linux because the intrinsics needed to compile the eh runtime aren't done yet. But if you turn it on and link with the mainline runtime then eh seems to work fine on x86-64 linux with this patch. Thanks to Dale for testing. The main point of the patch is that if you output that some object is encoded using 4 bytes you had better not output 8 bytes for it: the patch makes everything consistent. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50825 91177308-0d34-0410-b5e6-96231b3b80d8
144 lines
4.4 KiB
C++
144 lines
4.4 KiB
C++
//===-- TargetAsmInfo.cpp - Asm Info ---------------------------------------==//
|
|
//
|
|
// 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.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Target/TargetAsmInfo.h"
|
|
#include "llvm/Support/Dwarf.h"
|
|
#include <cctype>
|
|
#include <cstring>
|
|
|
|
using namespace llvm;
|
|
|
|
TargetAsmInfo::TargetAsmInfo() :
|
|
TextSection("\t.text"),
|
|
DataSection("\t.data"),
|
|
BSSSection("\t.bss"),
|
|
TLSDataSection("\t.section .tdata,\"awT\",@progbits"),
|
|
TLSBSSSection("\t.section .tbss,\"awT\",@nobits"),
|
|
ZeroFillDirective(0),
|
|
NonexecutableStackDirective(0),
|
|
NeedsSet(false),
|
|
MaxInstLength(4),
|
|
PCSymbol("$"),
|
|
SeparatorChar(';'),
|
|
CommentString("#"),
|
|
GlobalPrefix(""),
|
|
PrivateGlobalPrefix("."),
|
|
JumpTableSpecialLabelPrefix(0),
|
|
GlobalVarAddrPrefix(""),
|
|
GlobalVarAddrSuffix(""),
|
|
FunctionAddrPrefix(""),
|
|
FunctionAddrSuffix(""),
|
|
PersonalityPrefix(""),
|
|
PersonalitySuffix(""),
|
|
NeedsIndirectEncoding(false),
|
|
InlineAsmStart("#APP"),
|
|
InlineAsmEnd("#NO_APP"),
|
|
AssemblerDialect(0),
|
|
ZeroDirective("\t.zero\t"),
|
|
ZeroDirectiveSuffix(0),
|
|
AsciiDirective("\t.ascii\t"),
|
|
AscizDirective("\t.asciz\t"),
|
|
Data8bitsDirective("\t.byte\t"),
|
|
Data16bitsDirective("\t.short\t"),
|
|
Data32bitsDirective("\t.long\t"),
|
|
Data64bitsDirective("\t.quad\t"),
|
|
AlignDirective("\t.align\t"),
|
|
AlignmentIsInBytes(true),
|
|
TextAlignFillValue(0),
|
|
SwitchToSectionDirective("\t.section\t"),
|
|
TextSectionStartSuffix(""),
|
|
DataSectionStartSuffix(""),
|
|
SectionEndDirectiveSuffix(0),
|
|
ConstantPoolSection("\t.section .rodata"),
|
|
JumpTableDataSection("\t.section .rodata"),
|
|
JumpTableDirective(0),
|
|
CStringSection(0),
|
|
StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"),
|
|
StaticDtorsSection("\t.section .dtors,\"aw\",@progbits"),
|
|
FourByteConstantSection(0),
|
|
EightByteConstantSection(0),
|
|
SixteenByteConstantSection(0),
|
|
ReadOnlySection(0),
|
|
GlobalDirective("\t.globl\t"),
|
|
SetDirective(0),
|
|
LCOMMDirective(0),
|
|
COMMDirective("\t.comm\t"),
|
|
COMMDirectiveTakesAlignment(true),
|
|
HasDotTypeDotSizeDirective(true),
|
|
UsedDirective(0),
|
|
WeakRefDirective(0),
|
|
WeakDefDirective(0),
|
|
HiddenDirective("\t.hidden\t"),
|
|
ProtectedDirective("\t.protected\t"),
|
|
AbsoluteDebugSectionOffsets(false),
|
|
AbsoluteEHSectionOffsets(false),
|
|
HasLEB128(false),
|
|
HasDotLocAndDotFile(false),
|
|
SupportsDebugInformation(false),
|
|
SupportsExceptionHandling(false),
|
|
DwarfRequiresFrameSection(true),
|
|
GlobalEHDirective(0),
|
|
SupportsWeakOmittedEHFrame(true),
|
|
DwarfSectionOffsetDirective(0),
|
|
DwarfAbbrevSection(".debug_abbrev"),
|
|
DwarfInfoSection(".debug_info"),
|
|
DwarfLineSection(".debug_line"),
|
|
DwarfFrameSection(".debug_frame"),
|
|
DwarfPubNamesSection(".debug_pubnames"),
|
|
DwarfPubTypesSection(".debug_pubtypes"),
|
|
DwarfStrSection(".debug_str"),
|
|
DwarfLocSection(".debug_loc"),
|
|
DwarfARangesSection(".debug_aranges"),
|
|
DwarfRangesSection(".debug_ranges"),
|
|
DwarfMacInfoSection(".debug_macinfo"),
|
|
DwarfEHFrameSection(".eh_frame"),
|
|
DwarfExceptionSection(".gcc_except_table"),
|
|
AsmTransCBE(0) {
|
|
}
|
|
|
|
TargetAsmInfo::~TargetAsmInfo() {
|
|
}
|
|
|
|
/// Measure the specified inline asm to determine an approximation of its
|
|
/// length.
|
|
/// Comments (which run till the next SeparatorChar or newline) do not
|
|
/// count as an instruction.
|
|
/// Any other non-whitespace text is considered an instruction, with
|
|
/// multiple instructions separated by SeparatorChar or newlines.
|
|
/// Variable-length instructions are not handled here; this function
|
|
/// may be overloaded in the target code to do that.
|
|
unsigned TargetAsmInfo::getInlineAsmLength(const char *Str) const {
|
|
// Count the number of instructions in the asm.
|
|
bool atInsnStart = true;
|
|
unsigned Length = 0;
|
|
for (; *Str; ++Str) {
|
|
if (*Str == '\n' || *Str == SeparatorChar)
|
|
atInsnStart = true;
|
|
if (atInsnStart && !isspace(*Str)) {
|
|
Length += MaxInstLength;
|
|
atInsnStart = false;
|
|
}
|
|
if (atInsnStart && strncmp(Str, CommentString, strlen(CommentString))==0)
|
|
atInsnStart = false;
|
|
}
|
|
|
|
return Length;
|
|
}
|
|
|
|
unsigned TargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
|
bool Global) const {
|
|
return dwarf::DW_EH_PE_absptr;
|
|
}
|
|
|