136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--- ARMAttributeParser.h - ARM Attribute Information Printer ---------===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_READOBJ_ARMATTRIBUTE_PARSER_H 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_READOBJ_ARMATTRIBUTE_PARSER_H 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "StreamWriter.h" 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ARMBuildAttributes.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm { 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass StringRef; 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ARMAttributeParser { 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StreamWriter &SW; 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct DisplayHandler { 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ARMBuildAttrs::AttrType Attribute; 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void (ARMAttributeParser::*Routine)(ARMBuildAttrs::AttrType, 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const uint8_t *, uint32_t &); 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static const DisplayHandler DisplayRoutines[]; 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t ParseInteger(const uint8_t *Data, uint32_t &Offset); 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef ParseString(const uint8_t *Data, uint32_t &Offset); 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void IntegerAttribute(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void StringAttribute(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void PrintAttribute(unsigned Tag, unsigned Value, StringRef ValueDesc); 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void CPU_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void CPU_arch_profile(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ARM_ISA_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void THUMB_ISA_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void FP_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void WMMX_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void Advanced_SIMD_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void PCS_config(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_PCS_R9_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_PCS_RW_data(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_PCS_RO_data(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_PCS_GOT_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_PCS_wchar_t(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_rounding(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_denormal(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_exceptions(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_user_exceptions(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_number_model(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_align_needed(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_align_preserved(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_enum_size(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_HardFP_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_VFP_args(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_WMMX_args(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_optimization_goals(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_optimization_goals(ARMBuildAttrs::AttrType Tag, 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const uint8_t *Data, uint32_t &Offset); 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void compatibility(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void CPU_unaligned_access(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void FP_HP_extension(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ABI_FP_16bit_format(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void MPextension_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void DIV_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void T2EE_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void Virtualization_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void nodefaults(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t &Offset); 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ParseAttributeList(const uint8_t *Data, uint32_t &Offset, 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint32_t Length); 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ParseIndexList(const uint8_t *Data, uint32_t &Offset, 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<uint8_t> &IndexList); 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void ParseSubsection(const uint8_t *Data, uint32_t Length); 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ARMAttributeParser(StreamWriter &SW) : SW(SW) {} 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void Parse(ArrayRef<uint8_t> Section); 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 125