Skip to content

Commit cdb0a18

Browse files
committed
Use tag+strongly typed enum for second word value kinds
...and minor changes to the flag values + moved decl in SemaDecl.cpp
1 parent 737632e commit cdb0a18

File tree

4 files changed

+93
-69
lines changed

4 files changed

+93
-69
lines changed

clang/lib/Sema/SemaDecl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14968,7 +14968,8 @@ Sema::DeclGroupPtrTy Sema::FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS,
1496814968

1496914969
// Check if the Decl has been declared in '#pragma omp declare target'
1497014970
// directive and has static storage duration.
14971-
if (LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
14971+
if (auto *VD = dyn_cast<VarDecl>(D);
14972+
LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
1497214973
VD->hasGlobalStorage())
1497314974
OpenMP().ActOnOpenMPDeclareTargetInitializer(D);
1497414975
// For declarators, there are some additional syntactic-ish checks we need

llvm/lib/Target/RISCV/RISCV.h

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -54,49 +54,57 @@ struct CHERIoTImportedObject {
5454
/// The name of the used symbol.
5555
std::string Name;
5656

57-
enum LibraryFlagValue { IsLibrary, IsNotLibrary };
57+
enum class LibraryFlagValue : bool { IsNotLibrary = 0, IsLibrary = 1 };
5858

5959
/// Flag indicating whether this is a library or compartment import.
6060
LibraryFlagValue LibraryFlag;
6161

62-
enum PublicFlagValue { IsPublic, IsNotPublic };
62+
enum class PublicFlagValue : bool { IsNotPublic = 0, IsPublic = 1 };
6363

6464
/// Flag indicating that the entry should be public.
6565
PublicFlagValue PublicFlag;
6666

67-
enum GlobalFlagValue { IsGlobal, IsNotGlobal };
67+
enum class GlobalFlagValue : bool { IsNotGlobal = 0, IsGlobal = 1 };
6868

6969
/// Flag indicating that the entry is a global symbol.
7070
GlobalFlagValue GlobalFlag;
7171

72-
enum COMDATFlagValue { IsCOMDAT, IsNotCOMDAT };
72+
enum class COMDATFlagValue : bool { IsNotCOMDAT = 0, IsCOMDAT = 1 };
7373

7474
/// Flag indicating that the symbol is a COMDAT.
7575
COMDATFlagValue COMDATFlag;
7676

77-
enum WeakFlagValue { IsWeak, IsNotWeak };
77+
enum class WeakFlagValue : bool { IsNotWeak = 0, IsWeak = 1 };
7878

7979
/// Flag indicating that the symbol has weak linking.
8080
WeakFlagValue WeakFlag;
8181

82-
enum GroupedFlagValue { IsGrouped, IsNotGrouped };
82+
enum class GroupedFlagValue : bool { IsNotGrouped = 0, IsGrouped = 1 };
8383

8484
/// Flag indicating that the entry is grouped.
8585
GroupedFlagValue GroupedFlag;
8686

87-
enum WritableFlagValue { IsWritable, IsNotWritable };
87+
enum class WritableFlagValue : bool { IsNotWritable = 0, IsWritable = 1 };
8888

8989
/// Flag indicating that the entry needs the write flag set.
9090
WritableFlagValue WritableFlag;
9191

92-
/// The encoding and value of the second word.
93-
/// * Zero means the second word value will be zero.
94-
/// * Higher 32 bits == 1 means that the second word will be a literal value,
95-
/// which is taken from the lower 32 bits.
96-
/// * Higher 32 bits > 1 means that the second word will be a "diff and
97-
/// perms" encoding. The low 32 bits represent the encoding of the
98-
/// permissions.
99-
uint64_t SecondWordValue;
92+
enum SecondWordKind {
93+
/// The second word is zero.
94+
EmptySecondWordKind,
95+
/// The second word uses the `SecondWordValue` interpreted as the encoded
96+
/// value of permissions of the import.
97+
DiffAndPermsSecondWordKind,
98+
/// The second word uses the `SecondWordValue` interpreted as the size of
99+
/// the imported type.
100+
SizeOfTypeSecondWordKind
101+
};
102+
103+
/// The kind of the second word.
104+
SecondWordKind SecondWord;
105+
106+
/// The value of the second word.
107+
uint32_t SecondWordValue;
100108
};
101109

102110
/**
@@ -109,13 +117,14 @@ struct CHERIoTImportedObjectDenseMapInfo {
109117
return {"",
110118
"",
111119
"",
112-
CHERIoTImportedObject::IsNotLibrary,
113-
CHERIoTImportedObject::IsNotPublic,
114-
CHERIoTImportedObject::IsNotGlobal,
115-
CHERIoTImportedObject::IsNotCOMDAT,
116-
CHERIoTImportedObject::IsNotWeak,
117-
CHERIoTImportedObject::IsNotGrouped,
118-
CHERIoTImportedObject::IsNotWritable,
120+
CHERIoTImportedObject::LibraryFlagValue::IsNotLibrary,
121+
CHERIoTImportedObject::PublicFlagValue::IsNotPublic,
122+
CHERIoTImportedObject::GlobalFlagValue::IsNotGlobal,
123+
CHERIoTImportedObject::COMDATFlagValue::IsNotCOMDAT,
124+
CHERIoTImportedObject::WeakFlagValue::IsNotWeak,
125+
CHERIoTImportedObject::GroupedFlagValue::IsNotGrouped,
126+
CHERIoTImportedObject::WritableFlagValue::IsNotWritable,
127+
CHERIoTImportedObject::EmptySecondWordKind,
119128
0};
120129
}
121130

@@ -125,13 +134,14 @@ struct CHERIoTImportedObjectDenseMapInfo {
125134
return {"",
126135
"",
127136
"",
128-
CHERIoTImportedObject::IsLibrary,
129-
CHERIoTImportedObject::IsNotPublic,
130-
CHERIoTImportedObject::IsNotGlobal,
131-
CHERIoTImportedObject::IsNotCOMDAT,
132-
CHERIoTImportedObject::IsNotWeak,
133-
CHERIoTImportedObject::IsNotGrouped,
134-
CHERIoTImportedObject::IsNotWritable,
137+
CHERIoTImportedObject::LibraryFlagValue::IsLibrary,
138+
CHERIoTImportedObject::PublicFlagValue::IsNotPublic,
139+
CHERIoTImportedObject::GlobalFlagValue::IsNotGlobal,
140+
CHERIoTImportedObject::COMDATFlagValue::IsNotCOMDAT,
141+
CHERIoTImportedObject::WeakFlagValue::IsNotWeak,
142+
CHERIoTImportedObject::GroupedFlagValue::IsNotGrouped,
143+
CHERIoTImportedObject::WritableFlagValue::IsNotWritable,
144+
CHERIoTImportedObject::EmptySecondWordKind,
135145
0};
136146
}
137147

@@ -147,7 +157,7 @@ struct CHERIoTImportedObjectDenseMapInfo {
147157
// with mismatched export names (two different imports referring to the
148158
// same export may be permitted). Similarly, IsPublic depends on the
149159
// export and so may not differ.
150-
return (LHS.IsLibrary == RHS.IsLibrary) &&
160+
return (LHS.LibraryFlag == RHS.LibraryFlag) &&
151161
(LHS.ImportName == RHS.ImportName);
152162
}
153163
};

llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -730,41 +730,46 @@ void RISCVAsmPrinter::emitEndOfAsmFile(Module &M) {
730730
MCSectionELF *Section;
731731

732732
unsigned Flags = ELF::SHF_ALLOC;
733-
if (Entry.GroupedFlag == CHERIoTImportedObject::IsGrouped)
733+
if (Entry.GroupedFlag ==
734+
CHERIoTImportedObject::GroupedFlagValue::IsGrouped)
734735
Flags |= ELF::SHF_GROUP;
735-
if (Entry.WritableFlag == CHERIoTImportedObject::IsWritable)
736+
if (Entry.WritableFlag ==
737+
CHERIoTImportedObject::WritableFlagValue::IsWritable)
736738
Flags |= ELF::SHF_WRITE;
737739

738740
Section = C.getELFSection(
739741
".compartment_imports." + Entry.Name, ELF::SHT_PROGBITS, Flags, 0,
740742
Entry.ImportName,
741-
Entry.COMDATFlag == CHERIoTImportedObject::IsCOMDAT ? true : false);
743+
Entry.COMDATFlag == CHERIoTImportedObject::COMDATFlagValue::IsCOMDAT
744+
? true
745+
: false);
742746

743747
OutStreamer->switchSection(Section);
744748
auto *Sym = C.getOrCreateSymbol(Entry.ImportName);
745749
auto *ExportSym = C.getOrCreateSymbol(Entry.ExportName);
746750
OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeObject);
747-
if (Entry.WeakFlag == CHERIoTImportedObject::IsWeak)
751+
if (Entry.WeakFlag == CHERIoTImportedObject::WeakFlagValue::IsWeak)
748752
OutStreamer->emitSymbolAttribute(Sym, MCSA_Weak);
749-
if (Entry.GlobalFlag == CHERIoTImportedObject::IsGlobal)
753+
if (Entry.GlobalFlag == CHERIoTImportedObject::GlobalFlagValue::IsGlobal)
750754
OutStreamer->emitSymbolAttribute(Sym, llvm::MCSA_Global);
751755
OutStreamer->emitValueToAlignment(Align(8));
752756
OutStreamer->emitLabel(Sym);
753757
// Library imports have their low bit set.
754-
if (Entry.LibraryFlag == CHERIoTImportedObject::IsLibrary)
758+
if (Entry.LibraryFlag ==
759+
CHERIoTImportedObject::LibraryFlagValue::IsLibrary)
755760
OutStreamer->emitValue(
756761
MCBinaryExpr::createAdd(MCSymbolRefExpr::create(ExportSym, C),
757762
MCConstantExpr::create(1, C), C),
758763
4);
759764
else
760765
OutStreamer->emitValue(MCSymbolRefExpr::create(ExportSym, C), 4);
761766

762-
uint32_t SecondWordKind = Entry.SecondWordValue >> 32;
763767
uint32_t SecondWord = Entry.SecondWordValue;
764768

765-
if (!SecondWordKind)
769+
if (Entry.SecondWord == CHERIoTImportedObject::EmptySecondWordKind)
766770
OutStreamer->emitIntValue(0, 4);
767-
else if (SecondWordKind == 1) {
771+
else if (Entry.SecondWord ==
772+
CHERIoTImportedObject::DiffAndPermsSecondWordKind) {
768773
auto PermissionsEncoding = (int32_t)SecondWord;
769774
auto MangledExportNameEnd = Entry.ExportName + "_end";
770775
auto *EncodedPermissionsExpr =

llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -332,22 +332,22 @@ MachineBasicBlock *RISCVExpandPseudo::insertLoadOfImportTable(
332332
// Make the original basic block fall-through to the new.
333333
MBB.addSuccessor(NewMBB);
334334

335-
ImportedObjects.insert({ImportSymbol->getName().str(),
336-
ExportSymbol->getName().str(),
337-
ImportName.str(),
338-
IsLibrary ? CHERIoTImportedObject::IsLibrary
339-
: CHERIoTImportedObject::IsNotLibrary,
340-
IsPublic ? CHERIoTImportedObject::IsPublic
341-
: CHERIoTImportedObject::IsNotPublic,
342-
CHERIoTImportedObject::IsNotGlobal,
343-
IsPublic ? CHERIoTImportedObject::IsCOMDAT
344-
: CHERIoTImportedObject::IsNotCOMDAT,
345-
IsPublic ? CHERIoTImportedObject::IsWeak
346-
: CHERIoTImportedObject::IsNotWeak,
347-
IsPublic ? CHERIoTImportedObject::IsGrouped
348-
: CHERIoTImportedObject::IsNotGrouped,
349-
CHERIoTImportedObject::IsNotWritable,
350-
{}});
335+
ImportedObjects.insert(
336+
{ImportSymbol->getName().str(), ExportSymbol->getName().str(),
337+
ImportName.str(),
338+
IsLibrary ? CHERIoTImportedObject::LibraryFlagValue::IsLibrary
339+
: CHERIoTImportedObject::LibraryFlagValue::IsNotLibrary,
340+
IsPublic ? CHERIoTImportedObject::PublicFlagValue::IsPublic
341+
: CHERIoTImportedObject::PublicFlagValue::IsNotPublic,
342+
CHERIoTImportedObject::GlobalFlagValue::IsNotGlobal,
343+
IsPublic ? CHERIoTImportedObject::COMDATFlagValue::IsCOMDAT
344+
: CHERIoTImportedObject::COMDATFlagValue::IsNotCOMDAT,
345+
IsPublic ? CHERIoTImportedObject::WeakFlagValue::IsWeak
346+
: CHERIoTImportedObject::WeakFlagValue::IsNotWeak,
347+
IsPublic ? CHERIoTImportedObject::GroupedFlagValue::IsGrouped
348+
: CHERIoTImportedObject::GroupedFlagValue::IsNotGrouped,
349+
CHERIoTImportedObject::WritableFlagValue::IsNotWritable,
350+
CHERIoTImportedObject::EmptySecondWordKind, 0});
351351

352352
LivePhysRegs LiveRegs;
353353
computeAndAddLiveIns(LiveRegs, *NewMBB);
@@ -616,15 +616,19 @@ bool RISCVExpandPseudo::expandAuipccInstPair(
616616
BuildMI(NewMBB, DL, TII->get(RISCV::AUIPCC), TmpReg)
617617
.addSym(MangledImportSymbol, FlagsHi);
618618

619-
uint64_t EncodedPermissions =
620-
((uint64_t)1) << 32 | CapAttr.encodePermissions();
619+
auto EncodedPermissions = CapAttr.encodePermissions();
621620

622621
ImportedObjects.insert(
623622
{MangledImportName, MangledExportName, ImportName,
624-
CHERIoTImportedObject::IsNotLibrary, CHERIoTImportedObject::IsPublic,
625-
CHERIoTImportedObject::IsGlobal, CHERIoTImportedObject::IsCOMDAT,
626-
CHERIoTImportedObject::IsNotWeak, CHERIoTImportedObject::IsGrouped,
627-
CHERIoTImportedObject::IsWritable, EncodedPermissions});
623+
CHERIoTImportedObject::LibraryFlagValue::IsNotLibrary,
624+
CHERIoTImportedObject::PublicFlagValue::IsPublic,
625+
CHERIoTImportedObject::GlobalFlagValue::IsGlobal,
626+
CHERIoTImportedObject::COMDATFlagValue::IsCOMDAT,
627+
CHERIoTImportedObject::WeakFlagValue::IsNotWeak,
628+
CHERIoTImportedObject::GroupedFlagValue::IsGrouped,
629+
CHERIoTImportedObject::WritableFlagValue::IsWritable,
630+
CHERIoTImportedObject::DiffAndPermsSecondWordKind,
631+
EncodedPermissions});
628632
} else if (CheriotSealedValueAttr.has_value()) {
629633
// We can safely assume, here, that GV is not null.
630634
auto *GV = llvm::dyn_cast<llvm::GlobalVariable>(Symbol.getGlobal());
@@ -638,18 +642,22 @@ bool RISCVExpandPseudo::expandAuipccInstPair(
638642
.addSym(MangledImportSymbol, FlagsHi);
639643

640644
auto DL = MBB.getParent()->getDataLayout();
641-
uint64_t TypeSize = DL.getTypeStoreSize(GV->getValueType());
642645

643-
assert(TypeSize < std::numeric_limits<uint32_t>::max() &&
646+
assert(DL.getTypeStoreSize(GV->getValueType()) <
647+
std::numeric_limits<uint32_t>::max() &&
644648
"Size of type should be less than uint32_t::max()");
645-
TypeSize |= ((uint64_t)2) << 32;
646649

650+
uint32_t TypeSize = DL.getTypeStoreSize(GV->getValueType());
647651
ImportedObjects.insert(
648652
{MangledImportName, SealedObjectName, SealedObjectName,
649-
CHERIoTImportedObject::IsNotLibrary, CHERIoTImportedObject::IsPublic,
650-
CHERIoTImportedObject::IsNotGlobal, CHERIoTImportedObject::IsNotCOMDAT,
651-
CHERIoTImportedObject::IsWeak, CHERIoTImportedObject::IsGrouped,
652-
CHERIoTImportedObject::IsWritable, TypeSize});
653+
CHERIoTImportedObject::LibraryFlagValue::IsNotLibrary,
654+
CHERIoTImportedObject::PublicFlagValue::IsPublic,
655+
CHERIoTImportedObject::GlobalFlagValue::IsNotGlobal,
656+
CHERIoTImportedObject::COMDATFlagValue::IsNotCOMDAT,
657+
CHERIoTImportedObject::WeakFlagValue::IsWeak,
658+
CHERIoTImportedObject::GroupedFlagValue::IsGrouped,
659+
CHERIoTImportedObject::WritableFlagValue::IsWritable,
660+
CHERIoTImportedObject::SizeOfTypeSecondWordKind, TypeSize});
653661
} else {
654662
BuildMI(NewMBB, DL, TII->get(RISCV::AUIPCC), TmpReg)
655663
.addDisp(Symbol, 0, FlagsHi);

0 commit comments

Comments
 (0)