Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===-- llvm/BinaryFormat/XCOFF.h - The XCOFF file format -------*- C++/-*-===// |
| 2 | // |
||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
| 6 | // |
||
| 7 | //===----------------------------------------------------------------------===// |
||
| 8 | // |
||
| 9 | // This file defines manifest constants for the XCOFF object file format. |
||
| 10 | // |
||
| 11 | //===----------------------------------------------------------------------===// |
||
| 12 | |||
| 13 | #ifndef LLVM_BINARYFORMAT_XCOFF_H |
||
| 14 | #define LLVM_BINARYFORMAT_XCOFF_H |
||
| 15 | |||
| 16 | #include <stddef.h> |
||
| 17 | #include <stdint.h> |
||
| 18 | |||
| 19 | namespace llvm { |
||
| 20 | class StringRef; |
||
| 21 | template <unsigned> class SmallString; |
||
| 22 | template <typename T> class Expected; |
||
| 23 | |||
| 24 | namespace XCOFF { |
||
| 25 | |||
| 26 | // Constants used in the XCOFF definition. |
||
| 27 | |||
| 28 | constexpr size_t FileNamePadSize = 6; |
||
| 29 | constexpr size_t NameSize = 8; |
||
| 30 | constexpr size_t FileHeaderSize32 = 20; |
||
| 31 | constexpr size_t FileHeaderSize64 = 24; |
||
| 32 | constexpr size_t AuxFileHeaderSize32 = 72; |
||
| 33 | constexpr size_t AuxFileHeaderSize64 = 110; |
||
| 34 | constexpr size_t AuxFileHeaderSizeShort = 28; |
||
| 35 | constexpr size_t SectionHeaderSize32 = 40; |
||
| 36 | constexpr size_t SectionHeaderSize64 = 72; |
||
| 37 | constexpr size_t SymbolTableEntrySize = 18; |
||
| 38 | constexpr size_t RelocationSerializationSize32 = 10; |
||
| 39 | constexpr size_t RelocationSerializationSize64 = 14; |
||
| 40 | constexpr size_t ExceptionSectionEntrySize32 = 6; |
||
| 41 | constexpr size_t ExceptionSectionEntrySize64 = 10; |
||
| 42 | constexpr uint16_t RelocOverflow = 65535; |
||
| 43 | constexpr uint8_t AllocRegNo = 31; |
||
| 44 | |||
| 45 | enum ReservedSectionNum : int16_t { N_DEBUG = -2, N_ABS = -1, N_UNDEF = 0 }; |
||
| 46 | |||
| 47 | enum MagicNumber : uint16_t { XCOFF32 = 0x01DF, XCOFF64 = 0x01F7 }; |
||
| 48 | |||
| 49 | // Masks for packing/unpacking the r_rsize field of relocations. |
||
| 50 | |||
| 51 | // The msb is used to indicate if the bits being relocated are signed or |
||
| 52 | // unsigned. |
||
| 53 | static constexpr uint8_t XR_SIGN_INDICATOR_MASK = 0x80; |
||
| 54 | // The 2nd msb is used to indicate that the binder has replaced/modified the |
||
| 55 | // original instruction. |
||
| 56 | static constexpr uint8_t XR_FIXUP_INDICATOR_MASK = 0x40; |
||
| 57 | // The remaining bits specify the bit length of the relocatable reference |
||
| 58 | // minus one. |
||
| 59 | static constexpr uint8_t XR_BIASED_LENGTH_MASK = 0x3f; |
||
| 60 | |||
| 61 | // This field only exists in the XCOFF64 definition. |
||
| 62 | enum AuxHeaderFlags64 : uint16_t { |
||
| 63 | SHR_SYMTAB = 0x8000, ///< At exec time, create shared symbol table for program |
||
| 64 | ///< (main program only). |
||
| 65 | FORK_POLICY = 0x4000, ///< Forktree policy specified (main program only). |
||
| 66 | FORK_COR = 0x2000 ///< If _AOUT_FORK_POLICY is set, specify copy-on-reference |
||
| 67 | ///< if this bit is set. Specify copy-on- write otherwise. |
||
| 68 | ///< If _AOUT_FORK_POLICY is 0, this bit is reserved for |
||
| 69 | ///< future use and should be set to 0. |
||
| 70 | }; |
||
| 71 | |||
| 72 | enum XCOFFInterpret : uint16_t { |
||
| 73 | OLD_XCOFF_INTERPRET = 1, |
||
| 74 | NEW_XCOFF_INTERPRET = 2 |
||
| 75 | }; |
||
| 76 | |||
| 77 | enum FileFlag : uint16_t { |
||
| 78 | F_RELFLG = 0x0001, ///< relocation info stripped from file |
||
| 79 | F_EXEC = 0x0002, ///< file is executable (i.e., it |
||
| 80 | ///< has a loader section) |
||
| 81 | F_LNNO = 0x0004, ///< line numbers stripped from file |
||
| 82 | F_LSYMS = 0x0008, ///< local symbols stripped from file |
||
| 83 | F_FDPR_PROF = 0x0010, ///< file was profiled with FDPR |
||
| 84 | F_FDPR_OPTI = 0x0020, ///< file was reordered with FDPR |
||
| 85 | F_DSA = 0x0040, ///< file uses Dynamic Segment Allocation (32-bit |
||
| 86 | ///< only) |
||
| 87 | F_DEP_1 = 0x0080, ///< Data Execution Protection bit 1 |
||
| 88 | F_VARPG = 0x0100, ///< executable requests using variable size pages |
||
| 89 | F_LPTEXT = 0x0400, ///< executable requires large pages for text |
||
| 90 | F_LPDATA = 0x0800, ///< executable requires large pages for data |
||
| 91 | F_DYNLOAD = 0x1000, ///< file is dynamically loadable and |
||
| 92 | ///< executable (equivalent to F_EXEC on AIX) |
||
| 93 | F_SHROBJ = 0x2000, ///< file is a shared object |
||
| 94 | F_LOADONLY = |
||
| 95 | 0x4000, ///< file can be loaded by the system loader, but it is |
||
| 96 | ///< ignored by the linker if it is a member of an archive. |
||
| 97 | F_DEP_2 = 0x8000 ///< Data Execution Protection bit 2 |
||
| 98 | }; |
||
| 99 | |||
| 100 | // x_smclas field of x_csect from system header: /usr/include/syms.h |
||
| 101 | /// Storage Mapping Class definitions. |
||
| 102 | enum StorageMappingClass : uint8_t { |
||
| 103 | // READ ONLY CLASSES |
||
| 104 | XMC_PR = 0, ///< Program Code |
||
| 105 | XMC_RO = 1, ///< Read Only Constant |
||
| 106 | XMC_DB = 2, ///< Debug Dictionary Table |
||
| 107 | XMC_GL = 6, ///< Global Linkage (Interfile Interface Code) |
||
| 108 | XMC_XO = 7, ///< Extended Operation (Pseudo Machine Instruction) |
||
| 109 | XMC_SV = 8, ///< Supervisor Call (32-bit process only) |
||
| 110 | XMC_SV64 = 17, ///< Supervisor Call for 64-bit process |
||
| 111 | XMC_SV3264 = 18, ///< Supervisor Call for both 32- and 64-bit processes |
||
| 112 | XMC_TI = 12, ///< Traceback Index csect |
||
| 113 | XMC_TB = 13, ///< Traceback Table csect |
||
| 114 | |||
| 115 | // READ WRITE CLASSES |
||
| 116 | XMC_RW = 5, ///< Read Write Data |
||
| 117 | XMC_TC0 = 15, ///< TOC Anchor for TOC Addressability |
||
| 118 | XMC_TC = 3, ///< General TOC item |
||
| 119 | XMC_TD = 16, ///< Scalar data item in the TOC |
||
| 120 | XMC_DS = 10, ///< Descriptor csect |
||
| 121 | XMC_UA = 4, ///< Unclassified - Treated as Read Write |
||
| 122 | XMC_BS = 9, ///< BSS class (uninitialized static internal) |
||
| 123 | XMC_UC = 11, ///< Un-named Fortran Common |
||
| 124 | |||
| 125 | XMC_TL = 20, ///< Initialized thread-local variable |
||
| 126 | XMC_UL = 21, ///< Uninitialized thread-local variable |
||
| 127 | XMC_TE = 22 ///< Symbol mapped at the end of TOC |
||
| 128 | }; |
||
| 129 | |||
| 130 | // Flags for defining the section type. Masks for use with the (signed, 32-bit) |
||
| 131 | // s_flags field of the section header structure, selecting for values in the |
||
| 132 | // lower 16 bits. Defined in the system header `scnhdr.h`. |
||
| 133 | enum SectionTypeFlags : int32_t { |
||
| 134 | STYP_PAD = 0x0008, |
||
| 135 | STYP_DWARF = 0x0010, |
||
| 136 | STYP_TEXT = 0x0020, |
||
| 137 | STYP_DATA = 0x0040, |
||
| 138 | STYP_BSS = 0x0080, |
||
| 139 | STYP_EXCEPT = 0x0100, |
||
| 140 | STYP_INFO = 0x0200, |
||
| 141 | STYP_TDATA = 0x0400, |
||
| 142 | STYP_TBSS = 0x0800, |
||
| 143 | STYP_LOADER = 0x1000, |
||
| 144 | STYP_DEBUG = 0x2000, |
||
| 145 | STYP_TYPCHK = 0x4000, |
||
| 146 | STYP_OVRFLO = 0x8000 |
||
| 147 | }; |
||
| 148 | |||
| 149 | /// Values for defining the section subtype of sections of type STYP_DWARF as |
||
| 150 | /// they would appear in the (signed, 32-bit) s_flags field of the section |
||
| 151 | /// header structure, contributing to the 16 most significant bits. Defined in |
||
| 152 | /// the system header `scnhdr.h`. |
||
| 153 | enum DwarfSectionSubtypeFlags : int32_t { |
||
| 154 | SSUBTYP_DWINFO = 0x1'0000, ///< DWARF info section |
||
| 155 | SSUBTYP_DWLINE = 0x2'0000, ///< DWARF line section |
||
| 156 | SSUBTYP_DWPBNMS = 0x3'0000, ///< DWARF pubnames section |
||
| 157 | SSUBTYP_DWPBTYP = 0x4'0000, ///< DWARF pubtypes section |
||
| 158 | SSUBTYP_DWARNGE = 0x5'0000, ///< DWARF aranges section |
||
| 159 | SSUBTYP_DWABREV = 0x6'0000, ///< DWARF abbrev section |
||
| 160 | SSUBTYP_DWSTR = 0x7'0000, ///< DWARF str section |
||
| 161 | SSUBTYP_DWRNGES = 0x8'0000, ///< DWARF ranges section |
||
| 162 | SSUBTYP_DWLOC = 0x9'0000, ///< DWARF loc section |
||
| 163 | SSUBTYP_DWFRAME = 0xA'0000, ///< DWARF frame section |
||
| 164 | SSUBTYP_DWMAC = 0xB'0000 ///< DWARF macinfo section |
||
| 165 | }; |
||
| 166 | |||
| 167 | // STORAGE CLASSES, n_sclass field of syment. |
||
| 168 | // The values come from `storclass.h` and `dbxstclass.h`. |
||
| 169 | enum StorageClass : uint8_t { |
||
| 170 | // Storage classes used for symbolic debugging symbols. |
||
| 171 | C_FILE = 103, // File name |
||
| 172 | C_BINCL = 108, // Beginning of include file |
||
| 173 | C_EINCL = 109, // Ending of include file |
||
| 174 | C_GSYM = 128, // Global variable |
||
| 175 | C_STSYM = 133, // Statically allocated symbol |
||
| 176 | C_BCOMM = 135, // Beginning of common block |
||
| 177 | C_ECOMM = 137, // End of common block |
||
| 178 | C_ENTRY = 141, // Alternate entry |
||
| 179 | C_BSTAT = 143, // Beginning of static block |
||
| 180 | C_ESTAT = 144, // End of static block |
||
| 181 | C_GTLS = 145, // Global thread-local variable |
||
| 182 | C_STTLS = 146, // Static thread-local variable |
||
| 183 | |||
| 184 | // Storage classes used for DWARF symbols. |
||
| 185 | C_DWARF = 112, // DWARF section symbol |
||
| 186 | |||
| 187 | // Storage classes used for absolute symbols. |
||
| 188 | C_LSYM = 129, // Automatic variable allocated on stack |
||
| 189 | C_PSYM = 130, // Argument to subroutine allocated on stack |
||
| 190 | C_RSYM = 131, // Register variable |
||
| 191 | C_RPSYM = 132, // Argument to function or procedure stored in register |
||
| 192 | C_ECOML = 136, // Local member of common block |
||
| 193 | C_FUN = 142, // Function or procedure |
||
| 194 | |||
| 195 | // Storage classes used for undefined external symbols or |
||
| 196 | // symbols of general sections. |
||
| 197 | C_EXT = 2, // External symbol |
||
| 198 | C_WEAKEXT = 111, // Weak external symbol |
||
| 199 | |||
| 200 | // Storage classes used for symbols of general sections. |
||
| 201 | C_NULL = 0, |
||
| 202 | C_STAT = 3, // Static |
||
| 203 | C_BLOCK = 100, // ".bb" or ".eb" |
||
| 204 | C_FCN = 101, // ".bf" or ".ef" |
||
| 205 | C_HIDEXT = 107, // Un-named external symbol |
||
| 206 | C_INFO = 110, // Comment string in .info section |
||
| 207 | C_DECL = 140, // Declaration of object (type) |
||
| 208 | |||
| 209 | // Storage classes - Obsolete/Undocumented. |
||
| 210 | C_AUTO = 1, // Automatic variable |
||
| 211 | C_REG = 4, // Register variable |
||
| 212 | C_EXTDEF = 5, // External definition |
||
| 213 | C_LABEL = 6, // Label |
||
| 214 | C_ULABEL = 7, // Undefined label |
||
| 215 | C_MOS = 8, // Member of structure |
||
| 216 | C_ARG = 9, // Function argument |
||
| 217 | C_STRTAG = 10, // Structure tag |
||
| 218 | C_MOU = 11, // Member of union |
||
| 219 | C_UNTAG = 12, // Union tag |
||
| 220 | C_TPDEF = 13, // Type definition |
||
| 221 | C_USTATIC = 14, // Undefined static |
||
| 222 | C_ENTAG = 15, // Enumeration tag |
||
| 223 | C_MOE = 16, // Member of enumeration |
||
| 224 | C_REGPARM = 17, // Register parameter |
||
| 225 | C_FIELD = 18, // Bit field |
||
| 226 | C_EOS = 102, // End of structure |
||
| 227 | C_LINE = 104, |
||
| 228 | C_ALIAS = 105, // Duplicate tag |
||
| 229 | C_HIDDEN = 106, // Special storage class for external |
||
| 230 | C_EFCN = 255, // Physical end of function |
||
| 231 | |||
| 232 | // Storage classes - reserved |
||
| 233 | C_TCSYM = 134 // Reserved |
||
| 234 | }; |
||
| 235 | |||
| 236 | // Flags for defining the symbol type. Values to be encoded into the lower 3 |
||
| 237 | // bits of the (unsigned, 8-bit) x_smtyp field of csect auxiliary symbol table |
||
| 238 | // entries. Defined in the system header `syms.h`. |
||
| 239 | enum SymbolType : uint8_t { |
||
| 240 | XTY_ER = 0, ///< External reference. |
||
| 241 | XTY_SD = 1, ///< Csect definition for initialized storage. |
||
| 242 | XTY_LD = 2, ///< Label definition. |
||
| 243 | ///< Defines an entry point to an initialized csect. |
||
| 244 | XTY_CM = 3 ///< Common csect definition. For uninitialized storage. |
||
| 245 | }; |
||
| 246 | |||
| 247 | /// Values for visibility as they would appear when encoded in the high 4 bits |
||
| 248 | /// of the 16-bit unsigned n_type field of symbol table entries. Valid for |
||
| 249 | /// 32-bit XCOFF only when the vstamp in the auxiliary header is greater than 1. |
||
| 250 | enum VisibilityType : uint16_t { |
||
| 251 | SYM_V_UNSPECIFIED = 0x0000, |
||
| 252 | SYM_V_INTERNAL = 0x1000, |
||
| 253 | SYM_V_HIDDEN = 0x2000, |
||
| 254 | SYM_V_PROTECTED = 0x3000, |
||
| 255 | SYM_V_EXPORTED = 0x4000 |
||
| 256 | }; |
||
| 257 | |||
| 258 | constexpr uint16_t VISIBILITY_MASK = 0x7000; |
||
| 259 | |||
| 260 | // Relocation types, defined in `/usr/include/reloc.h`. |
||
| 261 | enum RelocationType : uint8_t { |
||
| 262 | R_POS = 0x00, ///< Positive relocation. Provides the address of the referenced |
||
| 263 | ///< symbol. |
||
| 264 | R_RL = 0x0c, ///< Positive indirect load relocation. Modifiable instruction. |
||
| 265 | R_RLA = 0x0d, ///< Positive load address relocation. Modifiable instruction. |
||
| 266 | |||
| 267 | R_NEG = 0x01, ///< Negative relocation. Provides the negative of the address |
||
| 268 | ///< of the referenced symbol. |
||
| 269 | R_REL = 0x02, ///< Relative to self relocation. Provides a displacement value |
||
| 270 | ///< between the address of the referenced symbol and the |
||
| 271 | ///< address being relocated. |
||
| 272 | |||
| 273 | R_TOC = 0x03, ///< Relative to the TOC relocation. Provides a displacement |
||
| 274 | ///< that is the difference between the address of the |
||
| 275 | ///< referenced symbol and the TOC anchor csect. |
||
| 276 | R_TRL = 0x12, ///< TOC relative indirect load relocation. Similar to R_TOC, |
||
| 277 | ///< but not modifiable instruction. |
||
| 278 | |||
| 279 | R_TRLA = |
||
| 280 | 0x13, ///< Relative to the TOC or to the thread-local storage base |
||
| 281 | ///< relocation. Compilers are not permitted to generate this |
||
| 282 | ///< relocation type. It is the result of a reversible |
||
| 283 | ///< transformation by the linker of an R_TOC relation that turned a |
||
| 284 | ///< load instruction into an add-immediate instruction. |
||
| 285 | |||
| 286 | R_GL = 0x05, ///< Global linkage-external TOC address relocation. Provides the |
||
| 287 | ///< address of the external TOC associated with a defined |
||
| 288 | ///< external symbol. |
||
| 289 | R_TCL = 0x06, ///< Local object TOC address relocation. Provides the address |
||
| 290 | ///< of the local TOC entry of a defined external symbol. |
||
| 291 | |||
| 292 | R_REF = 0x0f, ///< A non-relocating relocation. Used to prevent the binder |
||
| 293 | ///< from garbage collecting a csect (such as code used for |
||
| 294 | ///< dynamic initialization of non-local statics) for which |
||
| 295 | ///< another csect has an implicit dependency. |
||
| 296 | |||
| 297 | R_BA = 0x08, ///< Branch absolute relocation. Provides the address of the |
||
| 298 | ///< referenced symbol. References a non-modifiable instruction. |
||
| 299 | R_BR = 0x0a, ///< Branch relative to self relocation. Provides the |
||
| 300 | ///< displacement that is the difference between the address of |
||
| 301 | ///< the referenced symbol and the address of the referenced |
||
| 302 | ///< branch instruction. References a non-modifiable instruction. |
||
| 303 | R_RBA = 0x18, ///< Branch absolute relocation. Similar to R_BA but |
||
| 304 | ///< references a modifiable instruction. |
||
| 305 | R_RBR = 0x1a, ///< Branch relative to self relocation. Similar to the R_BR |
||
| 306 | ///< relocation type, but references a modifiable instruction. |
||
| 307 | |||
| 308 | R_TLS = 0x20, ///< General-dynamic reference to TLS symbol. |
||
| 309 | R_TLS_IE = 0x21, ///< Initial-exec reference to TLS symbol. |
||
| 310 | R_TLS_LD = 0x22, ///< Local-dynamic reference to TLS symbol. |
||
| 311 | R_TLS_LE = 0x23, ///< Local-exec reference to TLS symbol. |
||
| 312 | R_TLSM = 0x24, ///< Module reference to TLS. Provides a handle for the module |
||
| 313 | ///< containing the referenced symbol. |
||
| 314 | R_TLSML = 0x25, ///< Module reference to the local TLS storage. |
||
| 315 | |||
| 316 | R_TOCU = 0x30, ///< Relative to TOC upper. Specifies the high-order 16 bits of |
||
| 317 | ///< a large code model TOC-relative relocation. |
||
| 318 | R_TOCL = 0x31 ///< Relative to TOC lower. Specifies the low-order 16 bits of a |
||
| 319 | ///< large code model TOC-relative relocation. |
||
| 320 | }; |
||
| 321 | |||
| 322 | enum CFileStringType : uint8_t { |
||
| 323 | XFT_FN = 0, ///< Specifies the source-file name. |
||
| 324 | XFT_CT = 1, ///< Specifies the compiler time stamp. |
||
| 325 | XFT_CV = 2, ///< Specifies the compiler version number. |
||
| 326 | XFT_CD = 128 ///< Specifies compiler-defined information. |
||
| 327 | }; |
||
| 328 | |||
| 329 | enum CFileLangId : uint8_t { |
||
| 330 | TB_C = 0, ///< C language. |
||
| 331 | TB_CPLUSPLUS = 9 ///< C++ language. |
||
| 332 | }; |
||
| 333 | |||
| 334 | enum CFileCpuId : uint8_t { |
||
| 335 | TCPU_PPC64 = 2, ///< PowerPC common architecture 64-bit mode. |
||
| 336 | TCPU_COM = 3, ///< POWER and PowerPC architecture common. |
||
| 337 | TCPU_970 = 19 ///< PPC970 - PowerPC 64-bit architecture. |
||
| 338 | }; |
||
| 339 | |||
| 340 | enum SymbolAuxType : uint8_t { |
||
| 341 | AUX_EXCEPT = 255, ///< Identifies an exception auxiliary entry. |
||
| 342 | AUX_FCN = 254, ///< Identifies a function auxiliary entry. |
||
| 343 | AUX_SYM = 253, ///< Identifies a symbol auxiliary entry. |
||
| 344 | AUX_FILE = 252, ///< Identifies a file auxiliary entry. |
||
| 345 | AUX_CSECT = 251, ///< Identifies a csect auxiliary entry. |
||
| 346 | AUX_SECT = 250 ///< Identifies a SECT auxiliary entry. |
||
| 347 | }; // 64-bit XCOFF file only. |
||
| 348 | |||
| 349 | StringRef getMappingClassString(XCOFF::StorageMappingClass SMC); |
||
| 350 | StringRef getRelocationTypeString(XCOFF::RelocationType Type); |
||
| 351 | Expected<SmallString<32>> parseParmsType(uint32_t Value, unsigned FixedParmsNum, |
||
| 352 | unsigned FloatingParmsNum); |
||
| 353 | Expected<SmallString<32>> parseParmsTypeWithVecInfo(uint32_t Value, |
||
| 354 | unsigned FixedParmsNum, |
||
| 355 | unsigned FloatingParmsNum, |
||
| 356 | unsigned VectorParmsNum); |
||
| 357 | Expected<SmallString<32>> parseVectorParmsType(uint32_t Value, |
||
| 358 | unsigned ParmsNum); |
||
| 359 | |||
| 360 | struct TracebackTable { |
||
| 361 | enum LanguageID : uint8_t { |
||
| 362 | C, |
||
| 363 | Fortran, |
||
| 364 | Pascal, |
||
| 365 | Ada, |
||
| 366 | PL1, |
||
| 367 | Basic, |
||
| 368 | Lisp, |
||
| 369 | Cobol, |
||
| 370 | Modula2, |
||
| 371 | CPlusPlus, |
||
| 372 | Rpg, |
||
| 373 | PL8, |
||
| 374 | PLIX = PL8, |
||
| 375 | Assembly, |
||
| 376 | Java, |
||
| 377 | ObjectiveC |
||
| 378 | }; |
||
| 379 | // Byte 1 |
||
| 380 | static constexpr uint32_t VersionMask = 0xFF00'0000; |
||
| 381 | static constexpr uint8_t VersionShift = 24; |
||
| 382 | |||
| 383 | // Byte 2 |
||
| 384 | static constexpr uint32_t LanguageIdMask = 0x00FF'0000; |
||
| 385 | static constexpr uint8_t LanguageIdShift = 16; |
||
| 386 | |||
| 387 | // Byte 3 |
||
| 388 | static constexpr uint32_t IsGlobaLinkageMask = 0x0000'8000; |
||
| 389 | static constexpr uint32_t IsOutOfLineEpilogOrPrologueMask = 0x0000'4000; |
||
| 390 | static constexpr uint32_t HasTraceBackTableOffsetMask = 0x0000'2000; |
||
| 391 | static constexpr uint32_t IsInternalProcedureMask = 0x0000'1000; |
||
| 392 | static constexpr uint32_t HasControlledStorageMask = 0x0000'0800; |
||
| 393 | static constexpr uint32_t IsTOClessMask = 0x0000'0400; |
||
| 394 | static constexpr uint32_t IsFloatingPointPresentMask = 0x0000'0200; |
||
| 395 | static constexpr uint32_t IsFloatingPointOperationLogOrAbortEnabledMask = |
||
| 396 | 0x0000'0100; |
||
| 397 | |||
| 398 | // Byte 4 |
||
| 399 | static constexpr uint32_t IsInterruptHandlerMask = 0x0000'0080; |
||
| 400 | static constexpr uint32_t IsFunctionNamePresentMask = 0x0000'0040; |
||
| 401 | static constexpr uint32_t IsAllocaUsedMask = 0x0000'0020; |
||
| 402 | static constexpr uint32_t OnConditionDirectiveMask = 0x0000'001C; |
||
| 403 | static constexpr uint32_t IsCRSavedMask = 0x0000'0002; |
||
| 404 | static constexpr uint32_t IsLRSavedMask = 0x0000'0001; |
||
| 405 | static constexpr uint8_t OnConditionDirectiveShift = 2; |
||
| 406 | |||
| 407 | // Byte 5 |
||
| 408 | static constexpr uint32_t IsBackChainStoredMask = 0x8000'0000; |
||
| 409 | static constexpr uint32_t IsFixupMask = 0x4000'0000; |
||
| 410 | static constexpr uint32_t FPRSavedMask = 0x3F00'0000; |
||
| 411 | static constexpr uint32_t FPRSavedShift = 24; |
||
| 412 | |||
| 413 | // Byte 6 |
||
| 414 | static constexpr uint32_t HasExtensionTableMask = 0x0080'0000; |
||
| 415 | static constexpr uint32_t HasVectorInfoMask = 0x0040'0000; |
||
| 416 | static constexpr uint32_t GPRSavedMask = 0x003F'0000; |
||
| 417 | static constexpr uint32_t GPRSavedShift = 16; |
||
| 418 | |||
| 419 | // Byte 7 |
||
| 420 | static constexpr uint32_t NumberOfFixedParmsMask = 0x0000'FF00; |
||
| 421 | static constexpr uint8_t NumberOfFixedParmsShift = 8; |
||
| 422 | |||
| 423 | // Byte 8 |
||
| 424 | static constexpr uint32_t NumberOfFloatingPointParmsMask = 0x0000'00FE; |
||
| 425 | static constexpr uint32_t HasParmsOnStackMask = 0x0000'0001; |
||
| 426 | static constexpr uint8_t NumberOfFloatingPointParmsShift = 1; |
||
| 427 | |||
| 428 | // Masks to select leftmost bits for decoding parameter type information. |
||
| 429 | // Bit to use when vector info is not presented. |
||
| 430 | static constexpr uint32_t ParmTypeIsFloatingBit = 0x8000'0000; |
||
| 431 | static constexpr uint32_t ParmTypeFloatingIsDoubleBit = 0x4000'0000; |
||
| 432 | // Bits to use when vector info is presented. |
||
| 433 | static constexpr uint32_t ParmTypeIsFixedBits = 0x0000'0000; |
||
| 434 | static constexpr uint32_t ParmTypeIsVectorBits = 0x4000'0000; |
||
| 435 | static constexpr uint32_t ParmTypeIsFloatingBits = 0x8000'0000; |
||
| 436 | static constexpr uint32_t ParmTypeIsDoubleBits = 0xC000'0000; |
||
| 437 | static constexpr uint32_t ParmTypeMask = 0xC000'0000; |
||
| 438 | |||
| 439 | // Vector extension |
||
| 440 | static constexpr uint16_t NumberOfVRSavedMask = 0xFC00; |
||
| 441 | static constexpr uint16_t IsVRSavedOnStackMask = 0x0200; |
||
| 442 | static constexpr uint16_t HasVarArgsMask = 0x0100; |
||
| 443 | static constexpr uint8_t NumberOfVRSavedShift = 10; |
||
| 444 | |||
| 445 | static constexpr uint16_t NumberOfVectorParmsMask = 0x00FE; |
||
| 446 | static constexpr uint16_t HasVMXInstructionMask = 0x0001; |
||
| 447 | static constexpr uint8_t NumberOfVectorParmsShift = 1; |
||
| 448 | |||
| 449 | static constexpr uint32_t ParmTypeIsVectorCharBit = 0x0000'0000; |
||
| 450 | static constexpr uint32_t ParmTypeIsVectorShortBit = 0x4000'0000; |
||
| 451 | static constexpr uint32_t ParmTypeIsVectorIntBit = 0x8000'0000; |
||
| 452 | static constexpr uint32_t ParmTypeIsVectorFloatBit = 0xC000'0000; |
||
| 453 | |||
| 454 | static constexpr uint8_t WidthOfParamType = 2; |
||
| 455 | }; |
||
| 456 | |||
| 457 | // Extended Traceback table flags. |
||
| 458 | enum ExtendedTBTableFlag : uint8_t { |
||
| 459 | TB_OS1 = 0x80, ///< Reserved for OS use. |
||
| 460 | TB_RESERVED = 0x40, ///< Reserved for compiler. |
||
| 461 | TB_SSP_CANARY = 0x20, ///< stack smasher canary present on stack. |
||
| 462 | TB_OS2 = 0x10, ///< Reserved for OS use. |
||
| 463 | TB_EH_INFO = 0x08, ///< Exception handling info present. |
||
| 464 | TB_LONGTBTABLE2 = 0x01 ///< Additional tbtable extension exists. |
||
| 465 | }; |
||
| 466 | |||
| 467 | StringRef getNameForTracebackTableLanguageId(TracebackTable::LanguageID LangId); |
||
| 468 | SmallString<32> getExtendedTBTableFlagString(uint8_t Flag); |
||
| 469 | |||
| 470 | struct CsectProperties { |
||
| 471 | CsectProperties(StorageMappingClass SMC, SymbolType ST) |
||
| 472 | : MappingClass(SMC), Type(ST) {} |
||
| 473 | StorageMappingClass MappingClass; |
||
| 474 | SymbolType Type; |
||
| 475 | }; |
||
| 476 | |||
| 477 | } // end namespace XCOFF |
||
| 478 | } // end namespace llvm |
||
| 479 | |||
| 480 | #endif |