1b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines/*
2b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Copyright 2011, The Android Open Source Project
3b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *
4b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * you may not use this file except in compliance with the License.
6b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * You may obtain a copy of the License at
7b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *
8b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
9b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines *
10b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Unless required by applicable law or agreed to in writing, software
11b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * See the License for the specific language governing permissions and
14b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * limitations under the License.
15b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines */
16b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
17b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#ifndef ELF_TYPES_H
18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_TYPES_H
19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "utils/traits.h"
21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <stdint.h>
23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <llvm/Support/raw_ostream.h>
24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// ELF structure forward declarations
27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFHeader;
28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFObject;
29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFProgramHeader;
30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFReloc;
31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFRelocRel; // For TypeTraits
32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFRelocRela; // For TypeTraits
33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSection;
34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionBits;
35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionHeader;
36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionHeaderTable;
37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionNoBits;
38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionProgBits;
39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionRelTable;
40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionStrTab;
41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSectionSymTab;
42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> class ELFSymbol;
43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
44b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// Note: Following TypeTraits specialization MUST be compliant to the
45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// System V Application Binary Interface, Chap 4, Data Representation.
46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFHeader<32>        , 52, 4)
48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFHeader<64>        , 64, 8)
49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFProgramHeader<32> , 32, 4)
51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFProgramHeader<64> , 56, 8)
52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFSectionHeader<32> , 40, 4)
54b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFSectionHeader<64> , 64, 8)
55b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
56b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFSymbol<32>        , 16, 4)
57b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFSymbol<64>        , 24, 8)
58b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
59b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFRelocRel<32>      , 8, 4)
60b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFRelocRel<64>      , 16, 8)
61b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
62b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFRelocRela<32>     , 12, 4)
63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(ELFRelocRela<64>     , 24, 8)
64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// ELF primitive type wrappers
67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesnamespace detail {
68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_TYPE_WRAPPER(TYPE, IMPL)                                        \
69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  struct TYPE {                                                             \
70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    IMPL value;                                                             \
71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                                                            \
72b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    TYPE() : value(0) { }                                                   \
73b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    TYPE(IMPL val) : value(val) { }                                         \
74b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                                                            \
75b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    TYPE &operator=(TYPE const &with) { value = with.value; return *this; } \
76b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    TYPE &operator=(IMPL val) { value = val; return *this; }                \
77b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                                                            \
78b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    operator IMPL() const { return value; }                                 \
79b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  };
80b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
81b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELFHalf      , uint16_t)
82b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELFWord      , uint32_t)
83b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELFSword     , int32_t)
84b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELFXword     , uint64_t)
85b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELFSxword    , int64_t)
86b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELF32Address , uint32_t)
87b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELF32Offset  , uint32_t)
88b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELF64Address , uint64_t)
89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_WRAPPER(ELF64Offset  , uint64_t)
90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
91b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#undef ELF_TYPE_WRAPPER
92b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
93b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  extern llvm::raw_ostream &operator<<(llvm::raw_ostream &,
94b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                       ELF32Address const &);
95b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  extern llvm::raw_ostream &operator<<(llvm::raw_ostream &,
96b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                       ELF32Offset const &);
97b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  extern llvm::raw_ostream &operator<<(llvm::raw_ostream &,
98b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                       ELF64Address const &);
99b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  extern llvm::raw_ostream &operator<<(llvm::raw_ostream &,
100b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                       ELF64Offset const &);
101b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}
102b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
103b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// Note: Following TypeTraits specialization MUST be compliant to the
104b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// System V Application Binary Interface, Chap 4, Data Representation.
105b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
106b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELFHalf      , 2, 2)
107b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELFWord      , 4, 4)
108b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELFSword     , 4, 4)
109b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELFXword     , 8, 8)
110b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELFSxword    , 8, 8)
111b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELF32Address , 4, 4)
112b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELF32Offset  , 4, 4)
113b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELF64Address , 8, 8)
114b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesTYPE_TRAITS_SPECIALIZE(detail::ELF64Offset  , 8, 8)
115b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
116b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth>
117b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesstruct ELFPrimitiveTypes;
118b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
119b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <>
120b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesstruct ELFPrimitiveTypes<32> {
121b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELF32Address  address;
122b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELF32Offset   offset;
123b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
124b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef unsigned char         byte;
125b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFHalf       half;
126b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFWord       word;
127b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFSword      sword;
128b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
129b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFWord       relinfo;
130b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFSword      addend;
131b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFWord       symsize;
132b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
133b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  // Note: Don't use these types.  They are not in the specification of
134b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  // ELF 32.  However, we need these typedefs to define the type introduce
135b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  // macro.
136b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef void xword;
137b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef void sxword;
138b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
139b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
140b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <>
141b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesstruct ELFPrimitiveTypes<64> {
142b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELF64Address  address;
143b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELF64Offset   offset;
144b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
145b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef unsigned char         byte;
146b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFHalf       half;
147b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFWord       word;
148b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFSword      sword;
149b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFXword      xword;
150b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFSxword     sxword;
151b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
152b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFXword      relinfo;
153b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFSxword     addend;
154b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef detail::ELFXword      symsize;
155b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
156b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
157b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
158b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines// Macros to introduce these ELF types to a specific scope
159b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
160b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_STRUCT_TYPE_INTRO_TO_SCOPE(BITWIDTH)                            \
161b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFHeader<BITWIDTH>             ELFHeaderTy;                      \
162b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFObject<BITWIDTH>             ELFObjectTy;                      \
163b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFProgramHeader<BITWIDTH>      ELFProgramHeaderTy;               \
164b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFReloc<BITWIDTH>              ELFRelocTy;                       \
165b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFRelocRel<BITWIDTH>           ELFRelocRelTy;                    \
166b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFRelocRela<BITWIDTH>          ELFRelocRelaTy;                   \
167b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSection<BITWIDTH>            ELFSectionTy;                     \
168b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionBits<BITWIDTH>        ELFSectionBitsTy;                 \
169b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionHeader<BITWIDTH>      ELFSectionHeaderTy;               \
170b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionHeaderTable<BITWIDTH> ELFSectionHeaderTableTy;          \
171b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionNoBits<BITWIDTH>      ELFSectionNoBitsTy;               \
172b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionProgBits<BITWIDTH>    ELFSectionProgBitsTy;             \
173b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionRelTable<BITWIDTH>    ELFSectionRelTableTy;             \
174b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionStrTab<BITWIDTH>      ELFSectionStrTabTy;               \
175b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSectionSymTab<BITWIDTH>      ELFSectionSymTabTy;               \
176b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFSymbol<BITWIDTH>             ELFSymbolTy;
177b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
178b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
179b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(BITWIDTH)                          \
180b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  /* ELF structures */                                                      \
181b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_STRUCT_TYPE_INTRO_TO_SCOPE(BITWIDTH)                                  \
182b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                                                            \
183b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  /* ELF primitives */                                                      \
184b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::address addr_t;             \
185b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::offset  offset_t;           \
186b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::byte    byte_t;             \
187b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::half    half_t;             \
188b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::word    word_t;             \
189b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::sword   sword_t;            \
190b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::xword   xword_t;            \
191b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::sxword  sxword_t;           \
192b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::relinfo relinfo_t;          \
193b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::addend  addend_t;           \
194b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef typename ELFPrimitiveTypes<BITWIDTH>::symsize symsize_t;
195b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
196b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
197b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_TYPE_INTRO_TO_SCOPE(BITWIDTH)                                   \
198b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  /* ELF structures */                                                      \
199b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_STRUCT_TYPE_INTRO_TO_SCOPE(BITWIDTH)                                  \
200b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines                                                                            \
201b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  /* ELF primitives */                                                      \
202b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::address  addr_t;                     \
203b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::offset   offset_t;                   \
204b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::byte     byte_t;                     \
205b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::half     half_t;                     \
206b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::word     word_t;                     \
207b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::sword    sword_t;                    \
208b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::xword    xword_t;                    \
209b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::sxword   sxword_t;                   \
210b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::relinfo  relinfo_t;                  \
211b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::addend   addend_t;                   \
212b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  typedef ELFPrimitiveTypes<BITWIDTH>::symsize  symsize_t;
213b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
214b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
215b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // ELF_TYPES_H
216