mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-29 16:23:44 +00:00
e1abeb478a
the generic ELF version instead. This will result in its mergable constant sections getting named ".rodata.cst4" instead of ".cp.const4", but the linker looks at the section flags, not the name of the section AFAICT. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76659 91177308-0d34-0410-b5e6-96231b3b80d8
127 lines
4.5 KiB
C++
127 lines
4.5 KiB
C++
//===-- XCoreTargetAsmInfo.cpp - XCore 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 XCoreTargetAsmInfo properties.
|
|
// We use the small section flag for the CP relative and DP relative
|
|
// flags. If a section is small and writable then it is DP relative. If a
|
|
// section is small and not writable then it is CP relative.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "XCoreTargetAsmInfo.h"
|
|
#include "XCoreTargetMachine.h"
|
|
#include "llvm/GlobalVariable.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
|
|
using namespace llvm;
|
|
|
|
XCoreTargetAsmInfo::XCoreTargetAsmInfo(const XCoreTargetMachine &TM)
|
|
: ELFTargetAsmInfo(TM),
|
|
Subtarget(TM.getSubtargetImpl()) {
|
|
SupportsDebugInformation = true;
|
|
TextSection = getUnnamedSection("\t.text", SectionFlags::Code);
|
|
DataSection = getNamedSection("\t.dp.data", SectionFlags::Writeable |
|
|
SectionFlags::Small);
|
|
BSSSection_ = getNamedSection("\t.dp.bss", SectionFlags::Writeable |
|
|
SectionFlags::BSS | SectionFlags::Small);
|
|
if (Subtarget->isXS1A()) {
|
|
ReadOnlySection = getNamedSection("\t.dp.rodata", SectionFlags::None |
|
|
SectionFlags::Writeable |
|
|
SectionFlags::Small);
|
|
} else {
|
|
ReadOnlySection = getNamedSection("\t.cp.rodata", SectionFlags::None |
|
|
SectionFlags::Small);
|
|
}
|
|
Data16bitsDirective = "\t.short\t";
|
|
Data32bitsDirective = "\t.long\t";
|
|
Data64bitsDirective = 0;
|
|
ZeroDirective = "\t.space\t";
|
|
CommentString = "#";
|
|
ConstantPoolSection = "\t.section\t.cp.rodata,\"ac\",@progbits";
|
|
JumpTableDataSection = "\t.section\t.dp.data,\"awd\",@progbits";
|
|
PrivateGlobalPrefix = ".L";
|
|
AscizDirective = ".asciiz";
|
|
WeakDefDirective = "\t.weak\t";
|
|
WeakRefDirective = "\t.weak\t";
|
|
SetDirective = "\t.set\t";
|
|
|
|
// Debug
|
|
HasLEB128 = true;
|
|
AbsoluteDebugSectionOffsets = 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";
|
|
DwarfMacroInfoSection = "\t.section\t.debug_macinfo,\"\",@progbits";
|
|
}
|
|
|
|
const Section*
|
|
XCoreTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
|
|
SectionKind::Kind Kind = SectionKindForGlobal(GV);
|
|
|
|
if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) {
|
|
if (!GVar->isWeakForLinker()) {
|
|
switch (Kind) {
|
|
case SectionKind::RODataMergeConst:
|
|
return getReadOnlySection();
|
|
case SectionKind::ThreadData:
|
|
return DataSection;
|
|
case SectionKind::ThreadBSS:
|
|
return getBSSSection_();
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return ELFTargetAsmInfo::SelectSectionForGlobal(GV);
|
|
}
|
|
|
|
unsigned XCoreTargetAsmInfo::
|
|
SectionFlagsForGlobal(const GlobalValue *GV, const char* Name) const {
|
|
unsigned Flags = ELFTargetAsmInfo::SectionFlagsForGlobal(GV, Name);
|
|
// Mask out unsupported flags
|
|
Flags &= ~(SectionFlags::Small | SectionFlags::TLS);
|
|
|
|
// Set CP / DP relative flags
|
|
if (GV) {
|
|
SectionKind::Kind Kind = SectionKindForGlobal(GV);
|
|
switch (Kind) {
|
|
case SectionKind::ThreadData:
|
|
case SectionKind::ThreadBSS:
|
|
case SectionKind::Data:
|
|
case SectionKind::BSS:
|
|
case SectionKind::SmallData:
|
|
case SectionKind::SmallBSS:
|
|
Flags |= SectionFlags::Small;
|
|
break;
|
|
case SectionKind::ROData:
|
|
case SectionKind::RODataMergeStr:
|
|
case SectionKind::SmallROData:
|
|
if (Subtarget->isXS1A()) {
|
|
Flags |= SectionFlags::Writeable;
|
|
}
|
|
Flags |=SectionFlags::Small;
|
|
break;
|
|
case SectionKind::RODataMergeConst:
|
|
Flags |=SectionFlags::Small;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Flags;
|
|
}
|