[llvm] [NFC][Offload] Fix possible edge cases in offload-tblgen (PR #146511)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 1 04:41:27 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-offload

Author: Callum Fare (callumfare)

<details>
<summary>Changes</summary>

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

---
Full diff: https://github.com/llvm/llvm-project/pull/146511.diff


2 Files Affected:

- (modified) offload/tools/offload-tblgen/APIGen.cpp (+2-1) 
- (modified) offload/tools/offload-tblgen/RecordTypes.hpp (+8-3) 


``````````diff
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 {

``````````

</details>


https://github.com/llvm/llvm-project/pull/146511


More information about the llvm-commits mailing list