aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/XCore/XCoreTargetAsmInfo.cpp
diff options
context:
space:
mode:
authorRichard Osborne <richard@xmos.com>2008-11-07 10:59:00 +0000
committerRichard Osborne <richard@xmos.com>2008-11-07 10:59:00 +0000
commitab8167a19e0999867011e2fa79417203f512f4d3 (patch)
treef03bc8e40b55feab99b0f32e4428d215fa45f988 /lib/Target/XCore/XCoreTargetAsmInfo.cpp
parent0f63ae111d5a509911fc61246c1acc62f8c58f18 (diff)
downloadexternal_llvm-ab8167a19e0999867011e2fa79417203f512f4d3.zip
external_llvm-ab8167a19e0999867011e2fa79417203f512f4d3.tar.gz
external_llvm-ab8167a19e0999867011e2fa79417203f512f4d3.tar.bz2
Add XCore backend.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58838 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/XCore/XCoreTargetAsmInfo.cpp')
-rw-r--r--lib/Target/XCore/XCoreTargetAsmInfo.cpp201
1 files changed, 201 insertions, 0 deletions
diff --git a/lib/Target/XCore/XCoreTargetAsmInfo.cpp b/lib/Target/XCore/XCoreTargetAsmInfo.cpp
new file mode 100644
index 0000000..e2fabe2
--- /dev/null
+++ b/lib/Target/XCore/XCoreTargetAsmInfo.cpp
@@ -0,0 +1,201 @@
+//===-- 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()) {
+ 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";
+ DwarfMacInfoSection = "\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->mayBeOverridden()) {
+ switch (Kind) {
+ case SectionKind::RODataMergeStr:
+ return MergeableStringSection(GVar);
+ case SectionKind::RODataMergeConst:
+ return getReadOnlySection();
+ case SectionKind::ThreadData:
+ return DataSection;
+ case SectionKind::ThreadBSS:
+ return getBSSSection_();
+ default:
+ break;
+ }
+ }
+ }
+ return ELFTargetAsmInfo::SelectSectionForGlobal(GV);
+}
+
+const Section*
+XCoreTargetAsmInfo::SelectSectionForMachineConst(const Type *Ty) const {
+ return MergeableConstSection(Ty);
+}
+
+const Section*
+XCoreTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const {
+ Constant *C = GV->getInitializer();
+ return MergeableConstSection(C->getType());
+}
+
+inline const Section*
+XCoreTargetAsmInfo::MergeableConstSection(const Type *Ty) const {
+ const TargetData *TD = TM.getTargetData();
+
+ unsigned Size = TD->getABITypeSize(Ty);
+ if (Size == 4 || Size == 8 || Size == 16) {
+ std::string Name = ".cp.const" + utostr(Size);
+
+ return getNamedSection(Name.c_str(),
+ SectionFlags::setEntitySize(SectionFlags::Mergeable |
+ SectionFlags::Small,
+ Size));
+ }
+
+ return getReadOnlySection();
+}
+
+const Section* XCoreTargetAsmInfo::
+MergeableStringSection(const GlobalVariable *GV) const {
+ // FIXME insert in correct mergable section
+ return getReadOnlySection();
+}
+
+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;
+}
+
+std::string XCoreTargetAsmInfo::
+printSectionFlags(unsigned flags) const {
+ std::string Flags = ",\"";
+
+ if (!(flags & SectionFlags::Debug))
+ Flags += 'a';
+ if (flags & SectionFlags::Code)
+ Flags += 'x';
+ if (flags & SectionFlags::Writeable)
+ Flags += 'w';
+ if (flags & SectionFlags::Mergeable)
+ Flags += 'M';
+ if (flags & SectionFlags::Strings)
+ Flags += 'S';
+ if (flags & SectionFlags::TLS)
+ Flags += 'T';
+ if (flags & SectionFlags::Small) {
+ if (flags & SectionFlags::Writeable)
+ Flags += 'd'; // DP relative
+ else
+ Flags += 'c'; // CP relative
+ }
+
+ Flags += "\",";
+
+ Flags += '@';
+
+ if (flags & SectionFlags::BSS)
+ Flags += "nobits";
+ else
+ Flags += "progbits";
+
+ if (unsigned entitySize = SectionFlags::getEntitySize(flags))
+ Flags += "," + utostr(entitySize);
+
+ return Flags;
+}