@@ -49,19 +49,9 @@ class SubObjectRepresentabilityChecker
4949 BugReporter &BR) const ;
5050
5151private:
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>
129101std::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