Add support for reading ARM ELF build attributes.

Build attribute sections can now be read if they exist via ELFObjectFile, and
the llvm-readobj tool has been extended with an option to dump this information
if requested. Regression tests are also included which exercise these features.

Also update the docs with a fixed ARM ABI link and a new link to the Addenda
which provides the build attributes specification.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181009 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Amara Emerson
2013-05-03 11:36:35 +00:00
parent 820b3fd771
commit 5d446e61d9
11 changed files with 652 additions and 140 deletions

View File

@ -51,6 +51,7 @@ public:
virtual void printDynamicTable() LLVM_OVERRIDE;
virtual void printNeededLibraries() LLVM_OVERRIDE;
virtual void printProgramHeaders() LLVM_OVERRIDE;
virtual void printARMBuildAttributes() LLVM_OVERRIDE;
private:
typedef ELFObjectFile<ELFT> ELFO;
@ -858,3 +859,65 @@ void ELFDumper<ELFT>::printProgramHeaders() {
W.printNumber("Alignment", PI->p_align);
}
}
#define LLVM_READOBJ_ARMATTR_NUMCASE(X) case ARMBuildAttrs::X: \
W.printNumber(" Tag_" #X, BuildAttrs.Tag_##X); \
break; \
#define LLVM_READOBJ_ARMATTR_STRCASE(X) case ARMBuildAttrs::X: \
W.printString(" Tag_" #X, BuildAttrs.Tag_##X); \
break; \
template<class ELFT>
void ELFDumper<ELFT>::printARMBuildAttributes() {
if (Obj->getArch() != Triple::arm || !Obj->hasARMBuildAttributes())
return;
ARMBuildAttrs::ARMGenericBuildAttrInfo BuildAttrs;
SmallVector<unsigned, 16> AttrsRead;
error_code EC = Obj->readARMBuildAttributes(BuildAttrs, AttrsRead);
if (error(EC))
return;
DictScope D(W, "ARMBuildAttributes");
for (SmallVector<unsigned, 16>::iterator I = AttrsRead.begin(),
E = AttrsRead.end(); I != E; ++I) {
switch (*I) {
LLVM_READOBJ_ARMATTR_STRCASE(CPU_name)
LLVM_READOBJ_ARMATTR_STRCASE(CPU_raw_name)
LLVM_READOBJ_ARMATTR_NUMCASE(CPU_arch)
LLVM_READOBJ_ARMATTR_NUMCASE(CPU_arch_profile)
LLVM_READOBJ_ARMATTR_NUMCASE(ARM_ISA_use)
LLVM_READOBJ_ARMATTR_NUMCASE(THUMB_ISA_use)
LLVM_READOBJ_ARMATTR_NUMCASE(FP_arch)
LLVM_READOBJ_ARMATTR_NUMCASE(WMMX_arch)
LLVM_READOBJ_ARMATTR_NUMCASE(Advanced_SIMD_arch)
LLVM_READOBJ_ARMATTR_NUMCASE(PCS_config)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_R9_use)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_RW_data)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_RO_data)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_GOT_use)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_wchar_t)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_rounding)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_denormal)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_exceptions)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_user_exceptions)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_number_model)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_align8_needed)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_align8_preserved)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_enum_size)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_HardFP_use)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_VFP_args)
LLVM_READOBJ_ARMATTR_NUMCASE(CPU_unaligned_access)
LLVM_READOBJ_ARMATTR_NUMCASE(FP_HP_extension)
LLVM_READOBJ_ARMATTR_NUMCASE(MPextension_use)
LLVM_READOBJ_ARMATTR_NUMCASE(DIV_use)
LLVM_READOBJ_ARMATTR_NUMCASE(T2EE_use)
LLVM_READOBJ_ARMATTR_NUMCASE(Virtualization_use)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_optimization_goals)
LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_optimization_goals)
default:
break;
}
}
}