Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler-rt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,8 @@ option(COMPILER_RT_USE_BUILTINS_LIBRARY

option(COMPILER_RT_USE_ATOMIC_LIBRARY "Use compiler-rt atomic instead of libatomic" OFF)

option(COMPILER_RT_PROFILE_BAREMETAL "Build minimal baremetal profile library" OFF)

include(config-ix)

#================================
Expand Down
28 changes: 23 additions & 5 deletions compiler-rt/lib/profile/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,9 @@ int main() {
add_compiler_rt_component(profile)

set(PROFILE_SOURCES
GCDAProfiling.c
InstrProfiling.c
InstrProfilingInternal.c
InstrProfilingValue.c
InstrProfilingBuffer.c
InstrProfilingFile.c
InstrProfilingMerge.c
InstrProfilingMergeFile.c
InstrProfilingNameVar.c
Expand All @@ -77,10 +74,25 @@ set(PROFILE_SOURCES
InstrProfilingPlatformLinux.c
InstrProfilingPlatformOther.c
InstrProfilingPlatformWindows.c
InstrProfilingRuntime.cpp
InstrProfilingUtil.c
)

if (NOT COMPILER_RT_PROFILE_BAREMETAL)
# For baremetal, exclude the following:
# - Anything that contains filesystem operations (InstrProfilingFile.c,
# InstrProfilingUtils.c)
# - Initialization, because it isn't necesary without the filesystem bits
# on ELF targets (InstrProfilingRuntime.cpp).
# - Value profiling, because it requires malloc (InstrProfilingValue.c).
# This could be optional if someone needs it.
# - GCDA profiling, which is unrelated (GCDAProfiling.c)
list(APPEND PROFILE_SOURCES GCDAProfiling.c
InstrProfilingFile.c
InstrProfilingRuntime.cpp
InstrProfilingUtil.c
InstrProfilingValue.c
)
endif()

set(PROFILE_HEADERS
InstrProfiling.h
InstrProfilingInternal.h
Expand Down Expand Up @@ -135,6 +147,12 @@ if(COMPILER_RT_TARGET_HAS_UNAME)
-DCOMPILER_RT_HAS_UNAME=1)
endif()

if(COMPILER_RT_PROFILE_BAREMETAL)
set(EXTRA_FLAGS
${EXTRA_FLAGS}
-DCOMPILER_RT_PROFILE_BAREMETAL=1)
endif()

if(MSVC)
# profile historically has only been supported with the static runtime
# on windows
Expand Down
2 changes: 0 additions & 2 deletions compiler-rt/lib/profile/InstrProfiling.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
// with freestanding compilation. See `darwin_add_builtin_libraries`.

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "InstrProfiling.h"
Expand Down
5 changes: 5 additions & 0 deletions compiler-rt/lib/profile/InstrProfiling.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
#define PROFILE_INSTRPROFILING_H_

#include "InstrProfilingPort.h"
#include <stddef.h>
#ifndef COMPILER_RT_PROFILE_BAREMETAL
#include <stdio.h>
#endif

// Make sure __LLVM_INSTR_PROFILE_GENERATE is always defined before
// including instr_prof_interface.h so the interface functions are
Expand Down Expand Up @@ -200,7 +203,9 @@ int __llvm_profile_write_file(void);
* copying the old profile file to new profile file and this function is usually
* used when the proess doesn't have permission to open file.
*/
#ifndef COMPILER_RT_PROFILE_BAREMETAL
int __llvm_profile_set_file_object(FILE *File, int EnableMerge);
#endif

/*! \brief Register to write instrumentation data to file at exit. */
int __llvm_profile_register_write_file_atexit(void);
Expand Down
3 changes: 2 additions & 1 deletion compiler-rt/lib/profile/InstrProfilingMerge.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

#include "InstrProfiling.h"
#include "InstrProfilingInternal.h"
#include "InstrProfilingUtil.h"

#define INSTR_PROF_VALUE_PROF_DATA
#include "profile/InstrProfData.inc"
Expand Down Expand Up @@ -131,9 +130,11 @@ COMPILER_RT_VISIBILITY
int __llvm_profile_merge_from_buffer(const char *ProfileData,
uint64_t ProfileSize) {
if (__llvm_profile_get_version() & VARIANT_MASK_TEMPORAL_PROF) {
#ifndef COMPILER_RT_PROFILE_BAREMETAL
PROF_ERR("%s\n",
"Temporal profiles do not support profile merging at runtime. "
"Instead, merge raw profiles using the llvm-profdata tool.");
#endif
return 1;
}

Expand Down
1 change: 0 additions & 1 deletion compiler-rt/lib/profile/InstrProfilingMergeFile.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

#include "InstrProfiling.h"
#include "InstrProfilingInternal.h"
#include "InstrProfilingUtil.h"

#define INSTR_PROF_VALUE_PROF_DATA
#include "profile/InstrProfData.inc"
Expand Down
23 changes: 20 additions & 3 deletions compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,33 @@
|*
\*===----------------------------------------------------------------------===*/

// This file defines profile data symbols for ELF, wasm, XCOFF. It assumes
// __start_ and __stop_ symbols for profile data point at the beginning and
// end of the sections in question. (This is technically a linker feature,
// not a file format feature, but linkers for these targets support it.)
//
// MachO (MacOS/iOS) and PE-COFF (Windows) have a similar support, but the
// identifiers are different, so the support is in separate files.
//
// Support for targets which don't have linker support is in
// InstrProfilingPlatformOther.c.
//
// This file also contains code to extract ELF build IDs from the ELF file,
// to identify the build which generated the file.

#if defined(__linux__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
(defined(__sun__) && defined(__svr4__)) || defined(__NetBSD__) || \
defined(_AIX) || defined(__wasm__) || defined(__HAIKU__)
defined(_AIX) || defined(__wasm__) || defined(__HAIKU__) || \
defined(COMPILER_RT_PROFILE_BAREMETAL)

#if !defined(_AIX) && !defined(__wasm__)
#if !defined(_AIX) && !defined(__wasm__) && \
!defined(COMPILER_RT_PROFILE_BAREMETAL)
// Includes for non-baremetal ELF targets, used to output build IDs.
#include <elf.h>
#include <link.h>
#endif
#include <stdlib.h>
#include <string.h>
#endif

#include "InstrProfiling.h"
#include "InstrProfilingInternal.h"
Expand Down
10 changes: 9 additions & 1 deletion compiler-rt/lib/profile/InstrProfilingPlatformOther.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,18 @@
|*
\*===----------------------------------------------------------------------===*/

// This file defines a fallback implementation to compute the locations of
// profile data sections, for targets that don't have linker support. No
// commonly used targets use this codepath.
//
// This implementation expects the compiler instrumentation pass to define a
// constructor in each file which calls into this file.

#if !defined(__APPLE__) && !defined(__linux__) && !defined(__FreeBSD__) && \
!defined(__Fuchsia__) && !(defined(__sun__) && defined(__svr4__)) && \
!defined(__NetBSD__) && !defined(_WIN32) && !defined(_AIX) && \
!defined(__wasm__) && !defined(__HAIKU__)
!defined(__wasm__) && !defined(__HAIKU__) && \
!defined(COMPILER_RT_PROFILE_BAREMETAL)

#include <stdlib.h>
#include <stdio.h>
Expand Down
12 changes: 2 additions & 10 deletions compiler-rt/lib/profile/InstrProfilingPort.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ static inline size_t getpagesize(void) {
return S.dwPageSize;
}
#else /* defined(_WIN32) */
#ifndef COMPILER_RT_PROFILE_BAREMETAL
#include <unistd.h>
#endif
#endif /* defined(_WIN32) */

#define PROF_ERR(Format, ...) \
Expand All @@ -137,16 +139,6 @@ static inline size_t getpagesize(void) {
#define O_BINARY 0
#endif

#if defined(__FreeBSD__)

#include <inttypes.h>
#include <sys/types.h>

#else /* defined(__FreeBSD__) */

#include <inttypes.h>
#include <stdint.h>

#endif /* defined(__FreeBSD__) && defined(__i386__) */

#endif /* PROFILE_INSTRPROFILING_PORT_H_ */
Loading