Skip to content

Commit ca57acc

Browse files
committed
[CHERI-CSA] Add support for CHERIOT in SubObjectRepresentabilityChecker.
1 parent 4f00156 commit ca57acc

File tree

1 file changed

+26
-35
lines changed

1 file changed

+26
-35
lines changed

clang/lib/StaticAnalyzer/Checkers/CHERI/SubObjectRepresentabilityChecker.cpp

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,9 @@ class SubObjectRepresentabilityChecker
4949
BugReporter &BR) const;
5050

5151
private:
52-
using CheckFieldFn = std::function<std::unique_ptr<BugReport>(
53-
const FieldDecl *D, BugReporter &BR, const BugType &BT)>;
54-
55-
const std::map<llvm::Triple::ArchType, CheckFieldFn> CheckFieldFnMap = {
56-
//{llvm::Triple::aarch64, &checkFieldImpl<CompressedCap128m>},
57-
{llvm::Triple::mips,
58-
&checkFieldImpl<llvm::CompressedCapability::Cheri64>},
59-
{llvm::Triple::mips64,
60-
&checkFieldImpl<llvm::CompressedCapability::Cheri128>},
61-
{llvm::Triple::riscv32,
62-
&checkFieldImpl<llvm::CompressedCapability::Cheri64>},
63-
{llvm::Triple::riscv64,
64-
&checkFieldImpl<llvm::CompressedCapability::Cheri128>}};
52+
using CheckFieldFn = std::unique_ptr<BugReport> (*)(const FieldDecl *D,
53+
BugReporter &BR,
54+
const BugType &BT);
6555

6656
CheckFieldFn getCheckFieldFn(ASTContext &ASTCtx) const;
6757
};
@@ -107,25 +97,7 @@ reportExposedFields(const FieldDecl *D, ASTContext &ASTCtx, BugReporter &BR,
10797
return Report;
10898
}
10999

110-
#if 0
111-
template <typename Handler>
112-
typename Handler::cap_t getBoundedCap(uint64_t ParentSize, uint64_t Offset,
113-
uint64_t Size) {
114-
typename Handler::addr_t InitLength =
115-
Handler::representable_length(ParentSize);
116-
typename Handler::cap_t MockCap =
117-
Handler::make_max_perms_cap(0, Offset, InitLength);
118-
bool exact = Handler::setbounds(&MockCap, Size);
119-
assert(!exact);
120-
return MockCap;
121-
}
122-
#endif
123-
124-
template <typename Handler> uint64_t getRepresentableAlignment(uint64_t Size) {
125-
return ~Handler::representable_mask(Size) + 1;
126-
}
127-
128-
template <llvm::CompressedCapability::CapabilityFormat Handler>
100+
template <llvm::CompressedCapability::CapabilityFormat CapFormat>
129101
std::unique_ptr<BugReport> checkFieldImpl(const FieldDecl *D, BugReporter &BR,
130102
const BugType &BT) {
131103
QualType T = D->getType();
@@ -135,7 +107,8 @@ std::unique_ptr<BugReport> checkFieldImpl(const FieldDecl *D, BugReporter &BR,
135107
if (Offset > 0) {
136108
uint64_t Size = ASTCtx.getTypeSize(T) / 8;
137109
uint64_t ReqAlign =
138-
llvm::CompressedCapability::GetRequiredAlignment(Size, Handler).value();
110+
llvm::CompressedCapability::GetRequiredAlignment(Size, CapFormat)
111+
.value();
139112
uint64_t CurAlign = 1 << llvm::countr_zero(Offset);
140113
if (CurAlign < ReqAlign) {
141114
/* Emit warning */
@@ -155,7 +128,7 @@ std::unique_ptr<BugReport> checkFieldImpl(const FieldDecl *D, BugReporter &BR,
155128
uint64_t AlignedSize = Size + OffsetToAlign;
156129
uint64_t TailPadding = static_cast<uint64_t>(
157130
llvm::CompressedCapability::GetRequiredTailPadding(AlignedSize,
158-
Handler));
131+
CapFormat));
159132
uint64_t Top = Base + AlignedSize + TailPadding;
160133
OS << " Current bounds: " << Base << "-" << Top;
161134

@@ -184,7 +157,25 @@ SubObjectRepresentabilityChecker::getCheckFieldFn(ASTContext &ASTCtx) const {
184157
if (!TI.areAllPointersCapabilities())
185158
return nullptr;
186159

187-
auto It = CheckFieldFnMap.find(TI.getTriple().getArch());
160+
const auto &T = TI.getTriple();
161+
if (T.getArch() == llvm::Triple::riscv32 &&
162+
T.getSubArch() == llvm::Triple::RISCV32SubArch_cheriot_v1) {
163+
return &checkFieldImpl<llvm::CompressedCapability::Cheriot64>;
164+
}
165+
166+
static constexpr std::array CheckFieldFnMap = {
167+
std::make_pair(llvm::Triple::mips,
168+
&checkFieldImpl<llvm::CompressedCapability::Cheri64>),
169+
std::make_pair(llvm::Triple::mips64,
170+
&checkFieldImpl<llvm::CompressedCapability::Cheri128>),
171+
std::make_pair(llvm::Triple::riscv32,
172+
&checkFieldImpl<llvm::CompressedCapability::Cheri64>),
173+
std::make_pair(llvm::Triple::riscv64,
174+
&checkFieldImpl<llvm::CompressedCapability::Cheri128>),
175+
};
176+
177+
auto It = std::find_if(CheckFieldFnMap.begin(), CheckFieldFnMap.end(),
178+
[A = T.getArch()](auto p) { return p.first == A; });
188179
if (It == CheckFieldFnMap.end())
189180
return nullptr;
190181
return It->second;

0 commit comments

Comments
 (0)