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.
27 lines
762 B
C++
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);
|
|
}
|