Second set of ARM/MC/ELF changes.

Added ARM specific ELF section types.
Added AttributesSection to ARMElfTargetObject
First step in unifying .cpu assembly tag with ELF/.o
llc now asserts on actual ELF emission on -filetype=obj :-)

llvm-svn: 116257
This commit is contained in:
Jason W Kim 2010-10-11 23:01:44 +00:00
parent 84117119ff
commit 109ff296c8
5 changed files with 83 additions and 7 deletions

View File

@ -121,7 +121,18 @@ public:
// referenced symbol table contain the escape value SHN_XINDEX
SHT_SYMTAB_SHNDX = 0x12U,
LAST_KNOWN_SECTION_TYPE = SHT_SYMTAB_SHNDX
// Start of target-specific flags.
// Exception Index table
SHT_ARM_EXIDX = 0x70000001U,
// BPABI DLL dynamic linking pre-emption map
SHT_ARM_PREEMPTMAP = 0x70000002U,
// Object file compatibility attributes
SHT_ARM_ATTRIBUTES = 0x70000003U,
SHT_ARM_DEBUGOVERLAY = 0x70000004U,
SHT_ARM_OVERLAYSECTION = 0x70000005U,
LAST_KNOWN_SECTION_TYPE = SHT_ARM_OVERLAYSECTION
};
/// Valid section flags.

View File

@ -21,6 +21,7 @@
#include "ARMMachineFunctionInfo.h"
#include "ARMMCInstLower.h"
#include "ARMTargetMachine.h"
#include "ARMTargetObjectFile.h"
#include "llvm/Analysis/DebugInfo.h"
#include "llvm/Constants.h"
#include "llvm/Module.h"
@ -30,7 +31,6 @@
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
@ -110,8 +110,12 @@ namespace {
private:
// Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile()
void emitAttributes();
void emitTextAttribute(ARMBuildAttrs::SpecialAttr attr, StringRef v);
void emitAttribute(ARMBuildAttrs::AttrType attr, int v);
// Helper for ELF .o only
void emitARMAttributeSection();
public:
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
@ -495,12 +499,11 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
// Instead of subclassing the MCELFStreamer, we do the work here.
void ARMAsmPrinter::emitAttributes() {
// FIXME: Add in ELF specific section handling here.
// FIXME: unify this: .cpu and CPUString with enum attributes
emitARMAttributeSection();
std::string CPUString = Subtarget->getCPUString();
if (CPUString != "generic")
OutStreamer.EmitRawText("\t.cpu " + Twine(CPUString));
emitTextAttribute(ARMBuildAttrs::SEL_CPU, CPUString);
// FIXME: Emit FPU type
if (Subtarget->hasVFP2())
@ -529,6 +532,26 @@ void ARMAsmPrinter::emitAttributes() {
// FIXME: Should we signal R9 usage?
}
void ARMAsmPrinter::emitARMAttributeSection() {
// <format-version>
// [ <section-length> "vendor-name"
// [ <file-tag> <size> <attribute>*
// | <section-tag> <size> <section-number>* 0 <attribute>*
// | <symbol-tag> <size> <symbol-number>* 0 <attribute>*
// ]+
// ]*
if (OutStreamer.hasRawTextSupport())
return;
const ARMElfTargetObjectFile &TLOFELF =
static_cast<const ARMElfTargetObjectFile &>
(getObjFileLowering());
OutStreamer.SwitchSection(TLOFELF.getAttributesSection());
// Fixme: Still more to do here.
}
void ARMAsmPrinter::emitAttribute(ARMBuildAttrs::AttrType attr, int v) {
if (OutStreamer.hasRawTextSupport()) {
OutStreamer.EmitRawText("\t.eabi_attribute " +
@ -539,6 +562,21 @@ void ARMAsmPrinter::emitAttribute(ARMBuildAttrs::AttrType attr, int v) {
}
}
void ARMAsmPrinter::emitTextAttribute(ARMBuildAttrs::SpecialAttr attr,
StringRef val) {
switch (attr) {
default: assert(0 && "Unimplemented ARMBuildAttrs::SpecialAttr"); break;
case ARMBuildAttrs::SEL_CPU:
if (OutStreamer.hasRawTextSupport()) {
if (val != "generic") {
OutStreamer.EmitRawText("\t.cpu " + val);
}
} else {
// FIXME: ELF
}
}
}
//===----------------------------------------------------------------------===//
static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber,

View File

@ -16,7 +16,14 @@
#define __TARGET_ARMBUILDATTRS_H__
namespace ARMBuildAttrs {
enum SpecialAttr {
// This is for the .cpu asm attr. It translates into one or more
// AttrType (below) entries in the .ARM.attributes section in the ELF.
SEL_CPU
};
enum AttrType {
// Rest correspond to ELF/.ARM.attributes
File = 1,
Section = 2,
Symbol = 3,
@ -59,6 +66,11 @@ namespace ARMBuildAttrs {
Virtualization_use = 68,
MPextension_use = 70
};
// Magic numbers for .ARM.attributes
enum AttrMagic {
Format_Version = 0x41
};
}
#endif // __TARGET_ARMBUILDATTRS_H__

View File

@ -36,4 +36,10 @@ void ARMElfTargetObjectFile::Initialize(MCContext &Ctx,
MCSectionELF::SHF_ALLOC,
SectionKind::getDataRel());
}
AttributesSection =
getContext().getELFSection(".ARM.attributes",
MCSectionELF::SHT_ARM_ATTRIBUTES,
0,
SectionKind::getMetadata());
}

View File

@ -18,10 +18,19 @@ class MCContext;
class TargetMachine;
class ARMElfTargetObjectFile : public TargetLoweringObjectFileELF {
protected:
const MCSection *AttributesSection;
public:
ARMElfTargetObjectFile() : TargetLoweringObjectFileELF() {}
ARMElfTargetObjectFile() :
TargetLoweringObjectFileELF(),
AttributesSection(NULL)
{}
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
virtual const MCSection *getAttributesSection() const {
return AttributesSection;
}
};
} // end namespace llvm