[llvm] [NFC][Offload] Fix possible edge cases in offload-tblgen (PR #146511)
Callum Fare via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 1 04:40:56 PDT 2025
https://github.com/callumfare created https://github.com/llvm/llvm-project/pull/146511
Fix a couple of unhandled edge cases in offload-tblgen that were found by static analysis
* `LineStart` may wrap around to 0 when processing multi-line strings. The value is not actually being used in that case, but still better to explicitly handle it
* Possible unchecked nullptr when processing parameter flags
>From 2af2480a9a832d1482cb179bbf1757c80540c4dd Mon Sep 17 00:00:00 2001
From: Callum Fare <callum at codeplay.com>
Date: Tue, 1 Jul 2025 12:26:32 +0100
Subject: [PATCH] [Offload] Fix possible edge cases in offload-tblgen
---
offload/tools/offload-tblgen/APIGen.cpp | 3 ++-
offload/tools/offload-tblgen/RecordTypes.hpp | 11 ++++++++---
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/offload/tools/offload-tblgen/APIGen.cpp b/offload/tools/offload-tblgen/APIGen.cpp
index 800c9cadfe38b..35b080e3c8011 100644
--- a/offload/tools/offload-tblgen/APIGen.cpp
+++ b/offload/tools/offload-tblgen/APIGen.cpp
@@ -34,7 +34,8 @@ static std::string MakeComment(StringRef in) {
}
out += std::string("/// ") +
in.substr(LineStart, LineBreak - LineStart).str() + "\n";
- LineStart = LineBreak + 1;
+ if (LineBreak != std::string::npos)
+ LineStart = LineBreak + 1;
}
return out;
diff --git a/offload/tools/offload-tblgen/RecordTypes.hpp b/offload/tools/offload-tblgen/RecordTypes.hpp
index bb7c06c643da5..075b006eda451 100644
--- a/offload/tools/offload-tblgen/RecordTypes.hpp
+++ b/offload/tools/offload-tblgen/RecordTypes.hpp
@@ -157,9 +157,14 @@ class ParamRec {
bool isHandleType() const { return getType().ends_with("_handle_t"); }
bool isFptrType() const { return getType().ends_with("_cb_t"); }
StringRef getDesc() const { return rec->getValueAsString("desc"); }
- bool isIn() const { return dyn_cast<BitInit>(flags->getBit(0))->getValue(); }
- bool isOut() const { return dyn_cast<BitInit>(flags->getBit(1))->getValue(); }
- bool isOpt() const { return dyn_cast<BitInit>(flags->getBit(2))->getValue(); }
+ bool getFlagBit(unsigned int Bit) const {
+ if (auto *BitValue = dyn_cast<BitInit>(flags->getBit(Bit)))
+ return BitValue->getValue();
+ return false;
+ }
+ bool isIn() const { return getFlagBit(0); }
+ bool isOut() const { return getFlagBit(1); }
+ bool isOpt() const { return getFlagBit(2); }
const Record *getRec() const { return rec; }
std::optional<std::pair<StringRef, StringRef>> getRange() const {
More information about the llvm-commits
mailing list