1//===- MCSymbolGOFF.cpp - GOFF Symbol Representation ----------------------===//
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#include "llvm/MC/MCSymbolGOFF.h"
10#include "llvm/BinaryFormat/GOFF.h"
11#include "llvm/MC/MCContext.h"
12#include "llvm/Support/Alignment.h"
13#include "llvm/Support/ErrorHandling.h"
14
15using namespace llvm;
16
17MCSectionGOFF *MCSymbolGOFF::getSectionForCommonSymbol(MCContext &Ctx,
18 Align ByteAlignment) {
19 MCSectionGOFF *SD = Ctx.getGOFFSection(
20 Kind: SectionKind::getMetadata(), Name: getName(),
21 SDAttributes: GOFF::SDAttr{.TaskingBehavior: GOFF::ESD_TA_Unspecified, .BindingScope: GOFF::ESD_BSC_Unspecified});
22
23 MCSectionGOFF *ED = Ctx.getGOFFSection(
24 Kind: SectionKind::getMetadata(), Name: GOFF::CLASS_WSA,
25 EDAttributes: GOFF::EDAttr{.IsReadOnly: false, .Rmode: GOFF::ESD_RMODE_64, .NameSpace: GOFF::ESD_NS_Parts,
26 .TextStyle: GOFF::ESD_TS_ByteOriented, .BindAlgorithm: GOFF::ESD_BA_Merge,
27 .LoadBehavior: GOFF::ESD_LB_Deferred, .ReservedQwords: GOFF::ESD_RQ_0, .FillByteValue: 0},
28 Parent: SD);
29 ED->setAlignment(ByteAlignment);
30
31 return Ctx.getGOFFSection(Kind: SectionKind::getBSS(), Name: getName(),
32 PRAttributes: GOFF::PRAttr{.IsRenamable: false, .Executable: GOFF::ESD_EXE_DATA,
33 .Linkage: GOFF::ESD_LT_XPLink, .BindingScope: getBindingScope(),
34 .SortKey: 0},
35 Parent: ED);
36}
37
38bool MCSymbolGOFF::setSymbolAttribute(MCSymbolAttr Attribute) {
39 switch (Attribute) {
40 case MCSA_Invalid:
41 case MCSA_Cold:
42 case MCSA_ELF_TypeIndFunction:
43 case MCSA_ELF_TypeTLS:
44 case MCSA_ELF_TypeCommon:
45 case MCSA_ELF_TypeNoType:
46 case MCSA_ELF_TypeGnuUniqueObject:
47 case MCSA_LGlobal:
48 case MCSA_Extern:
49 case MCSA_Exported:
50 case MCSA_Internal:
51 case MCSA_LazyReference:
52 case MCSA_Local:
53 case MCSA_NoDeadStrip:
54 case MCSA_SymbolResolver:
55 case MCSA_AltEntry:
56 case MCSA_PrivateExtern:
57 case MCSA_Protected:
58 case MCSA_Reference:
59 case MCSA_WeakDefinition:
60 case MCSA_WeakDefAutoPrivate:
61 case MCSA_WeakAntiDep:
62 case MCSA_Memtag:
63 return false;
64
65 case MCSA_IndirectSymbol:
66 setIndirect(true);
67 break;
68 case MCSA_ELF_TypeFunction:
69 setCodeData(GOFF::ESDExecutable::ESD_EXE_CODE);
70 break;
71 case MCSA_ELF_TypeObject:
72 setCodeData(GOFF::ESDExecutable::ESD_EXE_DATA);
73 break;
74 case MCSA_OSLinkage:
75 setLinkage(GOFF::ESDLinkageType::ESD_LT_OS);
76 break;
77 case MCSA_XPLinkage:
78 setLinkage(GOFF::ESDLinkageType::ESD_LT_XPLink);
79 break;
80 case MCSA_Global:
81 setExternal(true);
82 break;
83 case MCSA_Weak:
84 case MCSA_WeakReference:
85 setExternal(true);
86 setWeak();
87 break;
88 case MCSA_Hidden:
89 setHidden(true);
90 break;
91 }
92
93 return true;
94}
95