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 |