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