[clang] [ItaniumCXXABI] Use getSigned() for offset hint (PR #174431)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 5 08:33:30 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-codegen
@llvm/pr-subscribers-clang
Author: Nikita Popov (nikic)
<details>
<summary>Changes</summary>
The offset hint can be negative, so we should use getSigned() here. This avoids an assertion failure with https://github.com/llvm/llvm-project/pull/171456.
Extend the dynamic_cast tests to include a 32-bit target to cover this case.
---
Full diff: https://github.com/llvm/llvm-project/pull/174431.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/ItaniumCXXABI.cpp (+1-1)
- (modified) clang/test/CodeGenCXX/dynamic-cast-hint.cpp (+21-17)
``````````diff
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index 10cdf4e479ccf..a6c80cd083bb8 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -1656,7 +1656,7 @@ llvm::Value *ItaniumCXXABI::emitDynamicCastCall(
// Compute the offset hint.
const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
- llvm::Value *OffsetHint = llvm::ConstantInt::get(
+ llvm::Value *OffsetHint = llvm::ConstantInt::getSigned(
PtrDiffLTy,
computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
diff --git a/clang/test/CodeGenCXX/dynamic-cast-hint.cpp b/clang/test/CodeGenCXX/dynamic-cast-hint.cpp
index 4ee50e14d2d34..75d5f82e7c24a 100644
--- a/clang/test/CodeGenCXX/dynamic-cast-hint.cpp
+++ b/clang/test/CodeGenCXX/dynamic-cast-hint.cpp
@@ -1,6 +1,7 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -std=c++98 -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -std=c++11 -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,64BIT
+// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -std=c++98 -o - %s | FileCheck %s --check-prefixes=CHECK,64BIT
+// RUN: %clang_cc1 -triple x86_64-apple-darwin12 -emit-llvm -std=c++11 -o - %s | FileCheck %s --check-prefixes=CHECK,64BIT
+// RUN: %clang_cc1 -triple i686-apple-darwin12 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,32BIT
class A { protected: virtual ~A() {} };
class B { protected: virtual ~B() {} };
@@ -24,32 +25,35 @@ class X : public XA, public XB, public XC { };
void test(A *a, B *b) {
volatile C *ac = dynamic_cast<C *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1C, i64 -2)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1C, [[INT:i64|i32]] -2)
volatile D *ad = dynamic_cast<D *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1D, i64 0)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1D, [[INT]] 0)
volatile E *ae = dynamic_cast<E *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1E, i64 0)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1E, [[INT]] 0)
volatile F *af = dynamic_cast<F *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1F, i64 -1)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1F, [[INT]] -1)
volatile G *ag = dynamic_cast<G *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1G, i64 -2)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1G, [[INT]] -2)
volatile H *ah = dynamic_cast<H *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1H, i64 0)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1H, [[INT]] 0)
volatile I *ai = dynamic_cast<I *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1I, i64 -1)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1I, [[INT]] -1)
volatile J *aj = dynamic_cast<J *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1J, i64 0)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1J, [[INT]] 0)
volatile K *ak = dynamic_cast<K *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1K, i64 -2)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1K, [[INT]] -2)
volatile X *ax = dynamic_cast<X *>(a);
-// CHECK: ptr @_ZTI1A, ptr @_ZTI1X, i64 -1)
+// CHECK: ptr @_ZTI1A, ptr @_ZTI1X, [[INT]] -1)
volatile E *be = dynamic_cast<E *>(b);
-// CHECK: ptr @_ZTI1B, ptr @_ZTI1E, i64 8)
+// 64BIT: ptr @_ZTI1B, ptr @_ZTI1E, [[INT]] 8)
+// 32BIT: ptr @_ZTI1B, ptr @_ZTI1E, [[INT]] 4)
volatile G *bg = dynamic_cast<G *>(b);
-// CHECK: ptr @_ZTI1B, ptr @_ZTI1G, i64 -2)
+// CHECK: ptr @_ZTI1B, ptr @_ZTI1G, [[INT]] -2)
volatile J *bj = dynamic_cast<J *>(b);
-// CHECK: ptr @_ZTI1B, ptr @_ZTI1J, i64 8)
+// 64BIT: ptr @_ZTI1B, ptr @_ZTI1J, [[INT]] 8)
+// 32BIT: ptr @_ZTI1B, ptr @_ZTI1J, [[INT]] 4)
volatile K *bk = dynamic_cast<K *>(b);
-// CHECK: ptr @_ZTI1B, ptr @_ZTI1K, i64 16)
+// 64BIT: ptr @_ZTI1B, ptr @_ZTI1K, [[INT]] 16)
+// 32BIT: ptr @_ZTI1B, ptr @_ZTI1K, [[INT]] 8)
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/174431
More information about the cfe-commits
mailing list