[llvm] a2239cb - [CHERI][RISCV][AsmPrinter] Use pointer index size rather than pointer size in AsmPrinter constant lowering. (#220100)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 11:23:35 PDT 2026


Author: Owen Anderson
Date: 2026-09-15T20:23:30+02:00
New Revision: a2239cbf89c9c8187a6deb83423eafad44e4a6d1

URL: https://github.com/llvm/llvm-project/commit/a2239cbf89c9c8187a6deb83423eafad44e4a6d1
DIFF: https://github.com/llvm/llvm-project/commit/a2239cbf89c9c8187a6deb83423eafad44e4a6d1.diff

LOG: [CHERI][RISCV][AsmPrinter] Use pointer index size rather than pointer size in AsmPrinter constant lowering. (#220100)

This prevents a crash due to APInt width mismatches during
accumulateConstantOffset for CHERI targets.

Added: 
    llvm/test/CodeGen/RISCV/cheri-global-cap-init.ll

Modified: 
    llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index c0348a2dad159..fe034ac8c97c5 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -3977,7 +3977,7 @@ const MCExpr *AsmPrinter::lowerConstant(const Constant *CV,
   }
   case Instruction::GetElementPtr: {
     // Generate a symbolic expression for the byte address
-    APInt OffsetAI(getDataLayout().getPointerTypeSizeInBits(CE->getType()), 0);
+    APInt OffsetAI(getDataLayout().getIndexTypeSizeInBits(CE->getType()), 0);
     cast<GEPOperator>(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
 
     const MCExpr *Base = lowerConstant(CE->getOperand(0));

diff  --git a/llvm/test/CodeGen/RISCV/cheri-global-cap-init.ll b/llvm/test/CodeGen/RISCV/cheri-global-cap-init.ll
new file mode 100644
index 0000000000000..f314fcc8cb0f6
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/cheri-global-cap-init.ll
@@ -0,0 +1,14 @@
+; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -target-abi=il32pc64 -mattr=+experimental-y | FileCheck %s --check-prefixes=CHECK,RV32
+; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -target-abi=l64pc128 -mattr=+experimental-y | FileCheck %s --check-prefixes=CHECK,RV64
+
+;; Previously crashed due to using pointer size rather than index size when computing the initializer of @b
+
+ at a = external addrspace(200) global i32
+ at b = addrspace(200) global iXLen ptrtoaddr (ptr addrspace(200) getelementptr (i8, ptr addrspace(200) @a, i64 8) to iXLen)
+
+; CHECK:     .globl b
+; CHECK:     b:
+; RV32-NEXT:   .word a+8
+; RV32-NEXT:   .size b, 4
+; RV64-NEXT:   .quad a+8
+; RV64-NEXT:   .size b, 8


        


More information about the llvm-commits mailing list