https://github.com/nikic created https://github.com/llvm/llvm-project/pull/174431
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. >From a1e795d190f81fa5d3e00d80576616b6c00ae58c Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 5 Jan 2026 17:30:46 +0100 Subject: [PATCH] [ItaniumCXXABI] Use getSigned() for offset hint --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 2 +- clang/test/CodeGenCXX/dynamic-cast-hint.cpp | 38 ++++++++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) 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) } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
