-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[GOFF] Add writing of section symbols #133799
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
c30968f
c896d83
4fd06dc
17a4e27
206a975
9c0e74b
a60a4fc
b7605f8
a3e042b
5843b76
5eb61cb
835b3d9
22b7612
4345699
bc99709
3fdb699
21a7b37
37942a1
6dc1524
db2f9d2
523aeb0
36b8e4a
e874216
9624600
f9184fb
d59806e
95f5689
18bd059
b521d09
6761c8c
d778ee0
87e459c
7a61400
06fee4e
3c1c4f6
4ccf3ab
e413983
0eec88f
c2d0449
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
//===- MCGOFFAttributes.h - Attributes of GOFF symbols --------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Defines the various attribute collections defining GOFF symbols. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_MC_MCGOFFATTRIBUTES_H | ||
#define LLVM_MC_MCGOFFATTRIBUTES_H | ||
|
||
#include "llvm/ADT/StringRef.h" | ||
#include "llvm/BinaryFormat/GOFF.h" | ||
#include <cstdint> | ||
|
||
namespace llvm { | ||
namespace GOFF { | ||
// An "External Symbol Definition" in the GOFF file has a type, and depending on | ||
// the type a different subset of the fields is used. | ||
// | ||
// Unlike other formats, a 2 dimensional structure is used to define the | ||
// location of data. For example, the equivalent of the ELF .text section is | ||
// made up of a Section Definition (SD) and a class (Element Definition; ED). | ||
// The name of the SD symbol depends on the application, while the class has the | ||
// predefined name C_CODE/C_CODE64 in AMODE31 and AMODE64 respectively. | ||
// | ||
// Data can be placed into this structure in 2 ways. First, the data (in a text | ||
// record) can be associated with an ED symbol. To refer to data, a Label | ||
// Definition (LD) is used to give an offset into the data a name. When binding, | ||
// the whole data is pulled into the resulting executable, and the addresses | ||
// given by the LD symbols are resolved. | ||
// | ||
// The alternative is to use a Part Definition (PR). In this case, the data (in | ||
// a text record) is associated with the part. When binding, only the data of | ||
// referenced PRs is pulled into the resulting binary. | ||
// | ||
// Both approaches are used. SD, ED, and PR elements are modelled by nested | ||
// MCSectionGOFF instances, while LD elements are associated with MCSymbolGOFF | ||
// instances. | ||
|
||
// Attributes for SD symbols. | ||
struct SDAttr { | ||
GOFF::ESDTaskingBehavior TaskingBehavior = GOFF::ESD_TA_Unspecified; | ||
GOFF::ESDBindingScope BindingScope = GOFF::ESD_BSC_Unspecified; | ||
}; | ||
|
||
// Attributes for ED symbols. | ||
struct EDAttr { | ||
bool IsReadOnly = false; | ||
GOFF::ESDRmode Rmode; | ||
GOFF::ESDNameSpaceId NameSpace = GOFF::ESD_NS_NormalName; | ||
GOFF::ESDTextStyle TextStyle = GOFF::ESD_TS_ByteOriented; | ||
GOFF::ESDBindingAlgorithm BindAlgorithm = GOFF::ESD_BA_Concatenate; | ||
GOFF::ESDLoadingBehavior LoadBehavior = GOFF::ESD_LB_Initial; | ||
GOFF::ESDReserveQwords ReservedQwords = GOFF::ESD_RQ_0; | ||
GOFF::ESDAlignment Alignment = GOFF::ESD_ALIGN_Doubleword; | ||
uint8_t FillByteValue = 0; | ||
}; | ||
|
||
// Attributes for LD symbols. | ||
struct LDAttr { | ||
bool IsRenamable = false; | ||
GOFF::ESDExecutable Executable = GOFF::ESD_EXE_Unspecified; | ||
GOFF::ESDBindingStrength BindingStrength = GOFF::ESD_BST_Strong; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For LD (as opposed to ER), it seems "strong" is the only allowed value here. Again, if this is true, it doesn't make much sense to specify it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is actually needed for C++ inline functions etc. which can end up in several object files. Also for weak definitions, e.g.:
and
(example taken from a blog by @MaskRay) Another case were the documentation needs an update. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see. This is not currently reflected in the HLASM output, however. How would one do this? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I need to ask for this. I see only WXTRN for weak externals in the HLASM documentation. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I got the hint that WXTRN may work for definitions, too. However, I still need to verify this. In any case, this needs to be handled when the function label is emitted. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Like above, right now there doesn't appear to be any code to emit LD symbols to asm output. |
||
GOFF::ESDLinkageType Linkage = GOFF::ESD_LT_XPLink; | ||
GOFF::ESDAmode Amode; | ||
GOFF::ESDBindingScope BindingScope = GOFF::ESD_BSC_Unspecified; | ||
}; | ||
|
||
// Attributes for PR symbols. | ||
struct PRAttr { | ||
bool IsRenamable = false; | ||
GOFF::ESDExecutable Executable = GOFF::ESD_EXE_Unspecified; | ||
GOFF::ESDLinkageType Linkage = GOFF::ESD_LT_XPLink; | ||
GOFF::ESDBindingScope BindingScope = GOFF::ESD_BSC_Unspecified; | ||
uint32_t SortKey = 0; | ||
}; | ||
|
||
// Predefined GOFF class names. | ||
constexpr StringLiteral CLASS_CODE = "C_CODE64"; | ||
constexpr StringLiteral CLASS_WSA = "C_WSA64"; | ||
constexpr StringLiteral CLASS_DATA = "C_DATA64"; | ||
constexpr StringLiteral CLASS_PPA2 = "C_@@QPPA2"; | ||
|
||
} // namespace GOFF | ||
} // namespace llvm | ||
|
||
#endif |
Uh oh!
There was an error while loading. Please reload this page.