This fixes the issue reported in https://github.com/llvm/llvm-project/pull/166855#issuecomment-3518604073 that had been revealed after https://github.com/llvm/llvm-project/pull/166855 was merged. `CodeGenFunction::GenerateVarArgsThunk` creates thunks for vararg functions by cloning and modifying them. It is different from `CodeGenFunction::generateThunk`, which is used for Itanium ABI. According to https://reviews.llvm.org/D39396, `CodeGenFunction::GenerateVarArgsThunk` may be called before metadata nodes are resolved. So, it tries to avoid remapping DISubprogram and all metadata nodes it references inside `CloneFunction()` by manually cloning DISubprogram. If optimization level is not OptNone, DILocalVariables for a function are saved in DISubprogram's retainedNodes field. When `CodeGenFunction::GenerateVarArgsThunk` clones such DISubprogram without remapping, it produces a subprogram with incorrectly-scoped retained nodes. It triggers Verifier checks added in https://github.com/llvm/llvm-project/pull/166855. To solve that, retained nodes list of a cloned DISubprogram is cleared.
50 lines
1.7 KiB
C++
50 lines
1.7 KiB
C++
// REQUIRES: asserts
|
|
// RUN: %clang_cc1 -O0 -triple %itanium_abi_triple -debug-info-kind=limited -emit-llvm %s -o - | \
|
|
// RUN: FileCheck %s
|
|
|
|
// Trigger GenerateVarArgsThunk.
|
|
// RUN: %clang_cc1 -O0 -triple riscv64-linux-gnu -debug-info-kind=limited -emit-llvm %s -o - | \
|
|
// RUN: FileCheck %s
|
|
|
|
// Check that retainedNodes are properly maintained at function cloning.
|
|
// RUN: %clang_cc1 -O1 -triple riscv64-linux-gnu -debug-info-kind=limited -emit-llvm %s -o - | \
|
|
// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-DI
|
|
|
|
// This test simply checks that the varargs thunk is created. The failing test
|
|
// case asserts.
|
|
|
|
typedef signed char __int8_t;
|
|
typedef int BOOL;
|
|
class CMsgAgent;
|
|
|
|
class CFs {
|
|
public:
|
|
typedef enum {} CACHE_HINT;
|
|
virtual BOOL ReqCacheHint( CMsgAgent* p_ma, CACHE_HINT hint, ... ) ;
|
|
};
|
|
|
|
typedef struct {} _Lldiv_t;
|
|
|
|
class CBdVfs {
|
|
public:
|
|
virtual ~CBdVfs( ) {}
|
|
};
|
|
|
|
class CBdVfsImpl : public CBdVfs, public CFs {
|
|
BOOL ReqCacheHint( CMsgAgent* p_ma, CACHE_HINT hint, ... );
|
|
};
|
|
|
|
BOOL CBdVfsImpl::ReqCacheHint( CMsgAgent* p_ma, CACHE_HINT hint, ... ) {
|
|
return true;
|
|
}
|
|
|
|
// CHECK: define {{.*}} @_ZThn{{[48]}}_N10CBdVfsImpl12ReqCacheHintEP9CMsgAgentN3CFs10CACHE_HINTEz(
|
|
|
|
// An empty retainedNodes list of cloned DISubprogram.
|
|
// CHECK-DI: [[EMPTY:![0-9]+]] = !{}
|
|
// CHECK-DI: distinct !DISubprogram({{.*}}, linkageName: "_ZN10CBdVfsImpl12ReqCacheHintEP9CMsgAgentN3CFs10CACHE_HINTEz", {{.*}}, retainedNodes: [[RN1:![0-9]+]]
|
|
// A non-empty retainedNodes list of original DISubprogram.
|
|
// CHECK-DI: [[RN1]] = !{!{{.*}}}
|
|
|
|
// CHECK-DI: distinct !DISubprogram({{.*}}, linkageName: "_ZN10CBdVfsImpl12ReqCacheHintEP9CMsgAgentN3CFs10CACHE_HINTEz", {{.*}}, retainedNodes: [[EMPTY]]
|