xref: /freebsd/contrib/llvm-project/llvm/include/llvm/MC/MCGOFFAttributes.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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