Vendor import of compiler-rt trunk r291012:
https://llvm.org/svn/llvm-project/compiler-rt/trunk@291012
This commit is contained in:
parent
316d58822d
commit
dad1defd96
@ -225,6 +225,17 @@ append_list_if(COMPILER_RT_HAS_WD4800_FLAG /wd4800 SANITIZER_COMMON_CFLAGS)
|
||||
# Warnings to turn off for all libraries, not just sanitizers.
|
||||
append_string_if(COMPILER_RT_HAS_WUNUSED_PARAMETER_FLAG -Wno-unused-parameter CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
|
||||
|
||||
if (CMAKE_LINKER MATCHES "link.exe$")
|
||||
# Silence MSVC linker warnings caused by empty object files. The
|
||||
# sanitizer libraries intentionally use ifdefs that result in empty
|
||||
# files, rather than skipping these files in the build system.
|
||||
# Ideally, we would pass this flag only for the libraries that need
|
||||
# it, but CMake doesn't seem to have a way to set linker flags for
|
||||
# individual static libraries, so we enable the suppression flag for
|
||||
# the whole compiler-rt project.
|
||||
append("/IGNORE:4221" CMAKE_STATIC_LINKER_FLAGS)
|
||||
endif()
|
||||
|
||||
add_subdirectory(include)
|
||||
|
||||
set(COMPILER_RT_LIBCXX_PATH ${LLVM_MAIN_SRC_DIR}/projects/libcxx)
|
||||
|
@ -112,14 +112,23 @@ static int __xray_OpenLogFile() XRAY_NEVER_INSTRUMENT {
|
||||
// Open a temporary file once for the log.
|
||||
static char TmpFilename[256] = {};
|
||||
static char TmpWildcardPattern[] = "XXXXXX";
|
||||
auto E = internal_strncat(TmpFilename, flags()->xray_logfile_base,
|
||||
sizeof(TmpFilename) - 10);
|
||||
if (static_cast<size_t>((E + 6) - TmpFilename) > (sizeof(TmpFilename) - 1)) {
|
||||
Report("XRay log file base too long: %s\n", flags()->xray_logfile_base);
|
||||
auto Argv = GetArgv();
|
||||
const char *Progname = Argv[0] == nullptr ? "(unknown)" : Argv[0];
|
||||
const char *LastSlash = internal_strrchr(Progname, '/');
|
||||
|
||||
if (LastSlash != nullptr)
|
||||
Progname = LastSlash + 1;
|
||||
|
||||
const int HalfLength = sizeof(TmpFilename) / 2 - sizeof(TmpWildcardPattern);
|
||||
int NeededLength = internal_snprintf(TmpFilename, sizeof(TmpFilename),
|
||||
"%.*s%.*s.%s",
|
||||
HalfLength, flags()->xray_logfile_base,
|
||||
HalfLength, Progname,
|
||||
TmpWildcardPattern);
|
||||
if (NeededLength > int(sizeof(TmpFilename))) {
|
||||
Report("XRay log file name too long (%d): %s\n", NeededLength, TmpFilename);
|
||||
return -1;
|
||||
}
|
||||
internal_strncat(TmpFilename, TmpWildcardPattern,
|
||||
sizeof(TmpWildcardPattern) - 1);
|
||||
int Fd = mkstemp(TmpFilename);
|
||||
if (Fd == -1) {
|
||||
Report("XRay: Failed opening temporary file '%s'; not logging events.\n",
|
||||
|
14
test/xray/TestCases/Linux/argv0-log-file-name.cc
Normal file
14
test/xray/TestCases/Linux/argv0-log-file-name.cc
Normal file
@ -0,0 +1,14 @@
|
||||
// Check to make sure argv[0] is contained within the (randomised) XRay log file
|
||||
// name.
|
||||
|
||||
// RUN: %clangxx_xray -std=c++11 %s -o %t
|
||||
// RUN: %run %t > xray.log.file.name 2>&1
|
||||
// RUN: ls | FileCheck xray.log.file.name
|
||||
// RUN: rm xray-log.* xray.log.file.name
|
||||
|
||||
#include <cstdio>
|
||||
#include <libgen.h>
|
||||
|
||||
[[clang::xray_always_instrument]] int main(int argc, char *argv[]) {
|
||||
printf("// CHECK: xray-log.%s.{{.*}}\n", basename(argv[0]));
|
||||
}
|
Loading…
Reference in New Issue
Block a user