llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Adam Smith (adams381)

<details>
<summary>Changes</summary>

`#cir.record_layout` carries `record_align`, which CIRGen fills from 
`ASTRecordLayout::getAlignment()` and consumers read as an `llvm::Align`.  That 
constructor asserts the value is a non-zero power of two, so hand-written CIR 
naming any other alignment aborted the tool rather than reporting a parse 
error.  A zero tripped the non-zero assert and a 3 tripped the power-of-two 
one, both inside `llvm::Align` with no indication of which attribute was at 
fault.

Verify the field where it is parsed.  Values CIRGen emits are already 
well-formed, so this only affects hand-written input.


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


3 Files Affected:

- (modified) clang/include/clang/CIR/Dialect/IR/CIRAttrs.td (+2) 
- (modified) clang/lib/CIR/Dialect/IR/CIRAttrs.cpp (+16) 
- (added) clang/test/CIR/IR/invalid-record-layout.cir (+19) 


``````````diff
diff --git a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td 
b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
index a0fe997156a69..5042ec9ab05aa 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
@@ -169,6 +169,8 @@ def CIR_RecordLayoutAttr : CIR_Attr<"RecordLayout", 
"record_layout"> {
     `>`
   }];
 
+  let genVerifyDecl = 1;
+
   let canHaveIllegalCXXABIType = 0;
 }
 
diff --git a/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp 
b/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp
index 264e836718c81..48cedbb44a856 100644
--- a/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp
@@ -920,6 +920,22 @@ LogicalResult DynamicCastInfoAttr::verify(
 // RecordLayout lookup
 
//===----------------------------------------------------------------------===//
 
+LogicalResult
+RecordLayoutAttr::verify(function_ref<InFlightDiagnostic()> emitError,
+                         cir::ArgPassingKind argPassingKind,
+                         bool hasTrivialDtor, uint64_t recordAlign) {
+  // record_align comes from ASTRecordLayout::getAlignment() and is consumed as
+  // an llvm::Align, which requires a non-zero power of two.  Reject anything
+  // else here so hand-written CIR gets a diagnostic instead of an assertion
+  // failure inside whichever pass reads the field.
+  if (recordAlign == 0)
+    return emitError() << "record_align must be non-zero";
+  if (!llvm::isPowerOf2_64(recordAlign))
+    return emitError() << "record_align must be a power of two, got "
+                       << recordAlign;
+  return success();
+}
+
 RecordLayoutAttr cir::getRecordLayout(mlir::ModuleOp module,
                                       mlir::StringAttr name) {
   auto dict = module->getAttrOfType<mlir::DictionaryAttr>(
diff --git a/clang/test/CIR/IR/invalid-record-layout.cir 
b/clang/test/CIR/IR/invalid-record-layout.cir
new file mode 100644
index 0000000000000..fa54ef6977acf
--- /dev/null
+++ b/clang/test/CIR/IR/invalid-record-layout.cir
@@ -0,0 +1,19 @@
+// RUN: cir-opt %s -verify-diagnostics -split-input-file
+
+module attributes {
+  cir.record_layouts = {
+    // expected-error @below {{record_align must be non-zero}}
+    S = #cir.record_layout<arg_passing_kind = can_pass_in_regs,
+                           has_trivial_dtor = true, record_align = 0>}
+} {
+}
+
+// -----
+
+module attributes {
+  cir.record_layouts = {
+    // expected-error @below {{record_align must be a power of two, got 3}}
+    S = #cir.record_layout<arg_passing_kind = can_pass_in_regs,
+                           has_trivial_dtor = true, record_align = 3>}
+} {
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/214074
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to