| 1 | //===- MCGOFFAttributes.h - Attributes of GOFF symbols --------------------===// |
| 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 | // Defines the various attribute collections defining GOFF symbols. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #ifndef LLVM_MC_MCGOFFATTRIBUTES_H |
| 14 | #define LLVM_MC_MCGOFFATTRIBUTES_H |
| 15 | |
| 16 | #include "llvm/ADT/StringRef.h" |
| 17 | #include "llvm/BinaryFormat/GOFF.h" |
| 18 | #include <cstdint> |
| 19 | |
| 20 | namespace llvm { |
| 21 | namespace GOFF { |
| 22 | // An "External Symbol Definition" in the GOFF file has a type, and depending on |
| 23 | // the type a different subset of the fields is used. |
| 24 | // |
| 25 | // Unlike other formats, a 2 dimensional structure is used to define the |
| 26 | // location of data. For example, the equivalent of the ELF .text section is |
| 27 | // made up of a Section Definition (SD) and a class (Element Definition; ED). |
| 28 | // The name of the SD symbol depends on the application, while the class has the |
| 29 | // predefined name C_CODE/C_CODE64 in AMODE31 and AMODE64 respectively. |
| 30 | // |
| 31 | // Data can be placed into this structure in 2 ways. First, the data (in a text |
| 32 | // record) can be associated with an ED symbol. To refer to data, a Label |
| 33 | // Definition (LD) is used to give an offset into the data a name. When binding, |
| 34 | // the whole data is pulled into the resulting executable, and the addresses |
| 35 | // given by the LD symbols are resolved. |
| 36 | // |
| 37 | // The alternative is to use a Part Definition (PR). In this case, the data (in |
| 38 | // a text record) is associated with the part. When binding, only the data of |
| 39 | // referenced PRs is pulled into the resulting binary. |
| 40 | // |
| 41 | // Both approaches are used. SD, ED, and PR elements are modelled by nested |
| 42 | // MCSectionGOFF instances, while LD elements are associated with MCSymbolGOFF |
| 43 | // instances. |
| 44 | |
| 45 | // Attributes for SD symbols. |
| 46 | struct SDAttr { |
| 47 | GOFF::ESDTaskingBehavior TaskingBehavior = GOFF::ESD_TA_Unspecified; |
| 48 | GOFF::ESDBindingScope BindingScope = GOFF::ESD_BSC_Unspecified; |
| 49 | }; |
| 50 | |
| 51 | // Attributes for ED symbols. |
| 52 | struct EDAttr { |
| 53 | bool IsReadOnly = false; |
| 54 | GOFF::ESDRmode Rmode; |
| 55 | GOFF::ESDNameSpaceId NameSpace = GOFF::ESD_NS_NormalName; |
| 56 | GOFF::ESDTextStyle TextStyle = GOFF::ESD_TS_ByteOriented; |
| 57 | GOFF::ESDBindingAlgorithm BindAlgorithm = GOFF::ESD_BA_Concatenate; |
| 58 | GOFF::ESDLoadingBehavior LoadBehavior = GOFF::ESD_LB_Initial; |
| 59 | GOFF::ESDReserveQwords ReservedQwords = GOFF::ESD_RQ_0; |
| 60 | GOFF::ESDAlignment Alignment = GOFF::ESD_ALIGN_Doubleword; |
| 61 | uint8_t FillByteValue = 0; |
| 62 | }; |
| 63 | |
| 64 | // Attributes for LD symbols. |
| 65 | struct LDAttr { |
| 66 | bool IsRenamable = false; |
| 67 | GOFF::ESDExecutable Executable = GOFF::ESD_EXE_Unspecified; |
| 68 | GOFF::ESDBindingStrength BindingStrength = GOFF::ESD_BST_Strong; |
| 69 | GOFF::ESDLinkageType Linkage = GOFF::ESD_LT_XPLink; |
| 70 | GOFF::ESDAmode Amode; |
| 71 | GOFF::ESDBindingScope BindingScope = GOFF::ESD_BSC_Unspecified; |
| 72 | }; |
| 73 | |
| 74 | // Attributes for PR symbols. |
| 75 | struct PRAttr { |
| 76 | bool IsRenamable = false; |
| 77 | GOFF::ESDExecutable Executable = GOFF::ESD_EXE_Unspecified; |
| 78 | GOFF::ESDLinkageType Linkage = GOFF::ESD_LT_XPLink; |
| 79 | GOFF::ESDBindingScope BindingScope = GOFF::ESD_BSC_Unspecified; |
| 80 | uint32_t SortKey = 0; |
| 81 | }; |
| 82 | |
| 83 | // Predefined GOFF class names. |
| 84 | constexpr StringLiteral CLASS_CODE = "C_CODE64" ; |
| 85 | constexpr StringLiteral CLASS_WSA = "C_WSA64" ; |
| 86 | constexpr StringLiteral CLASS_DATA = "C_DATA64" ; |
| 87 | constexpr StringLiteral CLASS_PPA2 = "C_@@QPPA2" ; |
| 88 | |
| 89 | } // namespace GOFF |
| 90 | } // namespace llvm |
| 91 | |
| 92 | #endif |
| 93 | |