Files
clang-p2996/compiler-rt/test/cfi/cross-dso-diagnostic.cpp
Petr Hosek eb46c95c3e [CMake] Use normalized Windows target triples
Changes the default Windows target triple returned by
GetHostTriple.cmake from the old environment names (which we wanted to
move away from) to newer, normalized ones. This also requires updating
all tests to use the new systems names in constraints.

Differential Revision: https://reviews.llvm.org/D47381

llvm-svn: 339307
2018-08-09 02:16:18 +00:00

48 lines
1.3 KiB
C++

// Check that cross-DSO diagnostics print the names of both modules
// RUN: %clangxx_cfi_diag -g -DSHARED_LIB -fPIC -shared -o %dynamiclib %s %ld_flags_rpath_so
// RUN: %clangxx_cfi_diag -g -o %t_exe_suffix %s %ld_flags_rpath_exe
// RUN: %t_exe_suffix 2>&1 | FileCheck -DDSONAME=%xdynamiclib_namespec %s
// UNSUPPORTED: windows-msvc
// REQUIRES: cxxabi
#include <dlfcn.h>
#include <stdio.h>
struct S1 {
virtual void f1();
};
#ifdef SHARED_LIB
void S1::f1() {}
__attribute__((visibility("default"))) extern "C"
void* dso_symbol() { return new S1(); }
#else
int main() {
void* (*fp)(void) =
reinterpret_cast<void*(*)(void)>(dlsym(RTLD_DEFAULT, "dso_symbol"));
if (!fp) {
perror("failed to resolve dso_symbol");
return 1;
}
// CHECK: runtime error: control flow integrity check for type 'void *()' failed during indirect function call
// CHECK: dso_symbol defined here
// CHECK: check failed in {{.*}}_exe_suffix, destination function located in {{.*}}[[DSONAME]]
void *S = fp(); // trigger cfi-icall failure
// CHECK: runtime error: control flow integrity check for type 'S1' failed during cast to unrelated type
// CHECK: invalid vtable
// CHECK: check failed in {{.*}}_exe_suffix, vtable located in {{.*}}[[DSONAME]]
S1 *Scast = reinterpret_cast<S1*>(S); // trigger cfi-unrelated-cast failure
return 0;
}
#endif // SHARED_LIB