llvm-project/bolt/test/safe-icf-relative-vtable.cpp
YongKang Zhu 4c17f9b684
[BOLT] Make safe ICF work with relative vtable (#170629)
To support relative vtable, we divide each vtable entry address by 4
instead of 8 when tracking addresses covered by vtable using bitvector.
This guarantees accuracy, saves the trouble of checking for each vtable
whether it is relative, and is also necessary for libraries for which
some contributing compilation units are compiled with relative vtable
while others are not.
2025-12-04 07:33:42 -08:00

27 lines
762 B
C++

// Test safe ICF works with binaries that contain relative vtable.
// REQUIRES: system-linux,asserts
// RUN: %clang %cxxflags -o %t.so %s -Wl,-q -fno-rtti
// RUN: llvm-bolt %t.so -o %t.bolt --no-threads --icf=safe \
// RUN: --debug-only=bolt-icf 2>&1 | FileCheck %s
// RUN: %clang %cxxflags -o %t.so %s -Wl,-q -fno-rtti \
// RUN: -fexperimental-relative-c++-abi-vtables
// RUN: llvm-bolt %t.so -o %t.bolt --no-threads --icf=safe \
// RUN: --debug-only=bolt-icf 2>&1 | FileCheck %s
// CHECK: folding {{.*bar.*}} into {{.*foo.*}}
// CHECK-NOT: skipping function with reference taken {{.*bar.*}}
class TT {
public:
virtual int foo(int a) { return ++a; }
virtual int bar(int a) { return ++a; }
};
int main() {
TT T;
return T.foo(0) + T.bar(1);
}