Reland "[CMake] Support installation of InstrProfData.inc"

This header fragment is useful on its own for any consumer that wants
to use custom instruction profile runtime with the LLVM instrumentation.
The concrete use case is in Fuchsia's kernel where we want to use
instruction profile instrumentation, but we cannot use the compiler-rt
runtime because it's not designed for use in the kernel environment.
This change allows installing this header as part of compiler-rt.

Differential Revision: https://reviews.llvm.org/D64532
This commit is contained in:
Petr Hosek 2019-11-22 12:09:15 -08:00
parent 90f641f2f1
commit f35032e03d
11 changed files with 34 additions and 14 deletions

View File

@ -28,10 +28,17 @@ if (COMPILER_RT_BUILD_XRAY)
)
endif(COMPILER_RT_BUILD_XRAY)
if (COMPILER_RT_BUILD_PROFILE)
set(PROFILE_HEADERS
profile/InstrProfData.inc
)
endif(COMPILER_RT_BUILD_PROFILE)
set(COMPILER_RT_HEADERS
${SANITIZER_HEADERS}
${FUZZER_HEADERS}
${XRAY_HEADERS})
${XRAY_HEADERS}
${PROFILE_HEADERS})
set(output_dir ${COMPILER_RT_OUTPUT_DIR}/include)
@ -66,6 +73,11 @@ install(FILES ${XRAY_HEADERS}
COMPONENT compiler-rt-headers
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
DESTINATION ${COMPILER_RT_INSTALL_PATH}/include/xray)
# Install profile headers.
install(FILES ${PROFILE_HEADERS}
COMPONENT compiler-rt-headers
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
DESTINATION ${COMPILER_RT_INSTALL_PATH}/include/profile)
if (NOT CMAKE_CONFIGURATION_TYPES) # don't add this for IDEs.
add_custom_target(install-compiler-rt-headers

View File

@ -68,7 +68,6 @@ set(PROFILE_SOURCES
)
set(PROFILE_HEADERS
InstrProfData.inc
InstrProfiling.h
InstrProfilingInternal.h
InstrProfilingPort.h
@ -82,6 +81,9 @@ if(WIN32)
)
endif()
include_directories(..)
include_directories(../../include)
if(FUCHSIA OR UNIX)
set(EXTRA_FLAGS
-fPIC

View File

@ -15,7 +15,7 @@
#include "InstrProfilingInternal.h"
#define INSTR_PROF_VALUE_PROF_DATA
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
COMPILER_RT_WEAK uint64_t INSTR_PROF_RAW_VERSION_VAR = INSTR_PROF_RAW_VERSION;

View File

@ -13,29 +13,29 @@
#include <stdio.h>
#define INSTR_PROF_VISIBILITY COMPILER_RT_VISIBILITY
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
enum ValueKind {
#define VALUE_PROF_KIND(Enumerator, Value, Descr) Enumerator = Value,
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
};
typedef void *IntPtrT;
typedef struct COMPILER_RT_ALIGNAS(INSTR_PROF_DATA_ALIGNMENT)
__llvm_profile_data {
#define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) Type Name;
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
} __llvm_profile_data;
typedef struct __llvm_profile_header {
#define INSTR_PROF_RAW_HEADER(Type, Name, Initializer) Type Name;
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
} __llvm_profile_header;
typedef struct ValueProfNode * PtrToNodeT;
typedef struct ValueProfNode {
#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Initializer) Type Name;
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
} ValueProfNode;
/*!
@ -120,7 +120,7 @@ int __llvm_profile_check_compatibility(const char *Profile,
*/
void INSTR_PROF_VALUE_PROF_FUNC(
#define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType) ArgType ArgName
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
);
void __llvm_profile_instrument_target_value(uint64_t TargetValue, void *Data,

View File

@ -14,7 +14,7 @@
#include "InstrProfilingUtil.h"
#define INSTR_PROF_VALUE_PROF_DATA
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
COMPILER_RT_VISIBILITY
void (*VPMergeHook)(ValueProfData *, __llvm_profile_data *);

View File

@ -16,7 +16,7 @@
#include "InstrProfilingUtil.h"
#define INSTR_PROF_VALUE_PROF_DATA
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
/* Merge value profile data pointed to by SrcValueProfData into
* in-memory profile counters pointed by to DstData. */

View File

@ -17,7 +17,7 @@
#define INSTR_PROF_VALUE_PROF_DATA
#define INSTR_PROF_COMMON_API_IMPL
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
static int hasStaticCounters = 1;
static int OutOfNodesWarnings = 0;

View File

@ -17,7 +17,7 @@
#include "InstrProfilingPort.h"
#define INSTR_PROF_VALUE_PROF_DATA
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
COMPILER_RT_VISIBILITY void (*FreeHook)(void *) = NULL;
static ProfBufferIO TheBufferIO;
@ -280,7 +280,7 @@ lprofWriteDataImpl(ProfDataWriter *Writer, const __llvm_profile_data *DataBegin,
/* Initialize header structure. */
#define INSTR_PROF_RAW_HEADER(Type, Name, Init) Header.Name = Init;
#include "InstrProfData.inc"
#include "profile/InstrProfData.inc"
/* Write the data. */
ProfDataIOVec IOVec[] = {

View File

@ -3,6 +3,7 @@ import("//clang/resource_dir.gni")
copy("include") {
sources = [
"fuzzer/FuzzedDataProvider.h",
"profile/InstrProfData.inc",
"sanitizer/allocator_interface.h",
"sanitizer/asan_interface.h",
"sanitizer/common_interface_defs.h",

View File

@ -25,6 +25,11 @@ static_library("profile") {
cflags += [ "/wd4221" ]
}
include_dirs = [
"..",
"../../include",
]
sources = [
"GCDAProfiling.c",
"InstrProfiling.c",