diff --git a/VERSION.md b/VERSION.md index 2220869..05e94bb 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1,6 +1,12 @@ -1.2.56 +1.2.57 # Change log +## 1.2.57 +- refactor: move linux userspace abstraction to unix userspace abstraction +- fix: prevent complex_cpp to run if encounter known bad compiler +- fix: illumos wrap gettid for illumos +- fix: illumos do not generate _Generic case for iint8_t on non linux +- fix: illumos change file api to use posix instead of linux extension ## 1.2.56 - cmd: fix gzip-to-stdout closing fd 1 on destruction (dup before gzdopen) - cmd: fix silent truncation of gzip output lines longer than 8 KB diff --git a/examples/complex_cpp/complex_cpp.cpp b/examples/complex_cpp/complex_cpp.cpp index 1f4dd62..9507a44 100644 --- a/examples/complex_cpp/complex_cpp.cpp +++ b/examples/complex_cpp/complex_cpp.cpp @@ -177,6 +177,11 @@ void typedef_example(void) CLLTK_TRACEPOINT(COMPLEX_CPP, "%u", value); } +#if defined(__GNUC__) && (__GNUC__ < 15) +void inline_functions(void) +{ /* not working with gcc < 15 */ +} +#else CLLTK_TRACEBUFFER(INLINE_FUNCTIONS_CPP, 4096); inline void inline_func(void) { @@ -213,6 +218,7 @@ void inline_functions(void) inline_func(); static_inline_func(); } +#endif CLLTK_TRACEBUFFER(NAMESPACE_FUNCTIONS, 4096); namespace test diff --git a/examples/process_threads/process_threads.cpp b/examples/process_threads/process_threads.cpp index e8e5403..4c9d2b8 100644 --- a/examples/process_threads/process_threads.cpp +++ b/examples/process_threads/process_threads.cpp @@ -6,14 +6,22 @@ #include #include #include -#include #include #include +#ifdef __linux__ +#include pid_t gettid(void) { return (pid_t)syscall(SYS_gettid); } +#elif defined(__illumos__) +#include +pid_t gettid(void) +{ + return (pid_t)_lwp_self(); +} +#endif CLLTK_TRACEBUFFER(ProcessAndThread, 256 * 1024); diff --git a/tracing_library/CMakeLists.txt b/tracing_library/CMakeLists.txt index 36394ec..2afeafd 100644 --- a/tracing_library/CMakeLists.txt +++ b/tracing_library/CMakeLists.txt @@ -115,10 +115,13 @@ foreach(LIB_NAME clltk_tracing_static clltk_tracing_shared) ${clltk_private_compiler_flags} ) - target_link_options(${LIB_NAME} - PRIVATE - -Wl,--gc-sections - ) + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_link_options(${LIB_NAME} + PRIVATE + -Wl,--gc-sections + ) + endif() endforeach() set_target_properties(clltk_tracing_static diff --git a/tracing_library/include/CommonLowLevelTracingKit/tracing/_arguments.h b/tracing_library/include/CommonLowLevelTracingKit/tracing/_arguments.h index 476f87c..f701c3c 100644 --- a/tracing_library/include/CommonLowLevelTracingKit/tracing/_arguments.h +++ b/tracing_library/include/CommonLowLevelTracingKit/tracing/_arguments.h @@ -52,50 +52,50 @@ struct _clltk_argument_types_t { /// supported c type to clltk type enum #ifndef CLLTK_FOR_CPP // for c #ifdef __KERNEL__ -#define _CLLTK_TYPE_TO_TYPE(_I_, _X_) \ - _Generic((_X_), \ - _CLLTK_GENERIC_CASE(bool, _clltk_argument_uint8), \ - _CLLTK_GENERIC_CASE(char, _clltk_argument_sint8), \ - _CLLTK_GENERIC_CASE(uint8_t, _clltk_argument_uint8), \ - _CLLTK_GENERIC_CASE(int8_t, _clltk_argument_sint8), \ - _CLLTK_GENERIC_CASE(uint16_t, _clltk_argument_uint16), \ - _CLLTK_GENERIC_CASE(int16_t, _clltk_argument_sint16), \ - _CLLTK_GENERIC_CASE(uint32_t, _clltk_argument_uint32), \ - _CLLTK_GENERIC_CASE(int32_t, _clltk_argument_sint32), \ - _CLLTK_GENERIC_CASE(uint64_t, _clltk_argument_uint64), \ - _CLLTK_GENERIC_CASE(int64_t, _clltk_argument_sint64), \ - _CLLTK_GENERIC_CASE(__uint128_t, _clltk_argument_uint128), \ - _CLLTK_GENERIC_CASE(__int128_t, _clltk_argument_sint128), \ - _CLLTK_GENERIC_CASE(float, _clltk_argument_float), \ - _CLLTK_GENERIC_CASE(double, _clltk_argument_double), \ - _CLLTK_GENERIC_CASE(void *, _clltk_argument_pointer), \ - _CLLTK_GENERIC_CASE(char *, _clltk_argument_string), \ - _CLLTK_GENERIC_CASE(const void *, _clltk_argument_pointer), \ - _CLLTK_GENERIC_CASE(const char *, _clltk_argument_string), \ +#define _CLLTK_TYPE_TO_TYPE(_I_, _X_) \ + _Generic((_X_), \ + _CLLTK_GENERIC_CASE(bool, _clltk_argument_uint8), \ + _CLLTK_GENERIC_CASE(char, _clltk_argument_sint8), \ + _CLLTK_GENERIC_CASE(uint8_t, _clltk_argument_uint8), \ + _CLLTK_ONLY_LINUX(_CLLTK_GENERIC_CASE(int8_t, _clltk_argument_sint8), ) \ + _CLLTK_GENERIC_CASE(uint16_t, _clltk_argument_uint16), \ + _CLLTK_GENERIC_CASE(int16_t, _clltk_argument_sint16), \ + _CLLTK_GENERIC_CASE(uint32_t, _clltk_argument_uint32), \ + _CLLTK_GENERIC_CASE(int32_t, _clltk_argument_sint32), \ + _CLLTK_GENERIC_CASE(uint64_t, _clltk_argument_uint64), \ + _CLLTK_GENERIC_CASE(int64_t, _clltk_argument_sint64), \ + _CLLTK_GENERIC_CASE(__uint128_t, _clltk_argument_uint128), \ + _CLLTK_GENERIC_CASE(__int128_t, _clltk_argument_sint128), \ + _CLLTK_GENERIC_CASE(float, _clltk_argument_float), \ + _CLLTK_GENERIC_CASE(double, _clltk_argument_double), \ + _CLLTK_GENERIC_CASE(void *, _clltk_argument_pointer), \ + _CLLTK_GENERIC_CASE(char *, _clltk_argument_string), \ + _CLLTK_GENERIC_CASE(const void *, _clltk_argument_pointer), \ + _CLLTK_GENERIC_CASE(const char *, _clltk_argument_string), \ default: _clltk_argument_pointer) // everything else as (void*) #else -#define _CLLTK_TYPE_TO_TYPE(_I_, _X_) \ - _Generic((_X_), \ - _CLLTK_GENERIC_CASE(bool, _clltk_argument_uint8), \ - _CLLTK_GENERIC_CASE(char, _clltk_argument_sint8), \ - _CLLTK_GENERIC_CASE(uint8_t, _clltk_argument_uint8), \ - _CLLTK_GENERIC_CASE(int8_t, _clltk_argument_sint8), \ - _CLLTK_GENERIC_CASE(uint16_t, _clltk_argument_uint16), \ - _CLLTK_GENERIC_CASE(int16_t, _clltk_argument_sint16), \ - _CLLTK_GENERIC_CASE(uint32_t, _clltk_argument_uint32), \ - _CLLTK_GENERIC_CASE(int32_t, _clltk_argument_sint32), \ - _CLLTK_GENERIC_CASE(uint64_t, _clltk_argument_uint64), \ - _CLLTK_GENERIC_CASE(int64_t, _clltk_argument_sint64), \ - _CLLTK_GENERIC_CASE(unsigned long long, _clltk_argument_uint64), \ - _CLLTK_GENERIC_CASE(signed long long, _clltk_argument_sint64), \ - _CLLTK_GENERIC_CASE(__uint128_t, _clltk_argument_uint128), \ - _CLLTK_GENERIC_CASE(__int128_t, _clltk_argument_sint128), \ - _CLLTK_GENERIC_CASE(float, _clltk_argument_float), \ - _CLLTK_GENERIC_CASE(double, _clltk_argument_double), \ - _CLLTK_GENERIC_CASE(void *, _clltk_argument_pointer), \ - _CLLTK_GENERIC_CASE(char *, _clltk_argument_string), \ - _CLLTK_GENERIC_CASE(const void *, _clltk_argument_pointer), \ - _CLLTK_GENERIC_CASE(const char *, _clltk_argument_string), \ +#define _CLLTK_TYPE_TO_TYPE(_I_, _X_) \ + _Generic((_X_), \ + _CLLTK_GENERIC_CASE(bool, _clltk_argument_uint8), \ + _CLLTK_GENERIC_CASE(char, _clltk_argument_sint8), \ + _CLLTK_GENERIC_CASE(uint8_t, _clltk_argument_uint8), \ + _CLLTK_ONLY_LINUX(_CLLTK_GENERIC_CASE(int8_t, _clltk_argument_sint8), ) \ + _CLLTK_GENERIC_CASE(uint16_t, _clltk_argument_uint16), \ + _CLLTK_GENERIC_CASE(int16_t, _clltk_argument_sint16), \ + _CLLTK_GENERIC_CASE(uint32_t, _clltk_argument_uint32), \ + _CLLTK_GENERIC_CASE(int32_t, _clltk_argument_sint32), \ + _CLLTK_GENERIC_CASE(uint64_t, _clltk_argument_uint64), \ + _CLLTK_GENERIC_CASE(int64_t, _clltk_argument_sint64), \ + _CLLTK_GENERIC_CASE(unsigned long long, _clltk_argument_uint64), \ + _CLLTK_GENERIC_CASE(signed long long, _clltk_argument_sint64), \ + _CLLTK_GENERIC_CASE(__uint128_t, _clltk_argument_uint128), \ + _CLLTK_GENERIC_CASE(__int128_t, _clltk_argument_sint128), \ + _CLLTK_GENERIC_CASE(float, _clltk_argument_float), \ + _CLLTK_GENERIC_CASE(double, _clltk_argument_double), \ + _CLLTK_GENERIC_CASE(void *, _clltk_argument_pointer), \ + _CLLTK_GENERIC_CASE(char *, _clltk_argument_string), \ + _CLLTK_GENERIC_CASE(const void *, _clltk_argument_pointer), \ + _CLLTK_GENERIC_CASE(const char *, _clltk_argument_string), \ default: _clltk_argument_pointer) // everything else as (void*) #endif @@ -175,48 +175,48 @@ template static CONST_INLINE constexpr _clltk_argument_t _CLLTK_TYP /// supported c type to clltk type enum #ifndef CLLTK_FOR_CPP // for c #ifdef __KERNEL__ -#define _CLLTK_TYPE_IS_FLEX(_I_, _X_) \ - _Generic((_X_), \ - _CLLTK_GENERIC_CASE(char, false), \ - _CLLTK_GENERIC_CASE(uint8_t, false), \ - _CLLTK_GENERIC_CASE(int8_t, false), \ - _CLLTK_GENERIC_CASE(uint16_t, false), \ - _CLLTK_GENERIC_CASE(int16_t, false), \ - _CLLTK_GENERIC_CASE(uint32_t, false), \ - _CLLTK_GENERIC_CASE(int32_t, false), \ - _CLLTK_GENERIC_CASE(uint64_t, false), \ - _CLLTK_GENERIC_CASE(int64_t, false), \ - _CLLTK_GENERIC_CASE(__uint128_t, false), \ - _CLLTK_GENERIC_CASE(__int128_t, false), \ - _CLLTK_GENERIC_CASE(float, false), \ - _CLLTK_GENERIC_CASE(double, false), \ - _CLLTK_GENERIC_CASE(void *, false), \ - _CLLTK_GENERIC_CASE(char *, true), \ - _CLLTK_GENERIC_CASE(const void *, false), \ - _CLLTK_GENERIC_CASE(const char *, true), \ +#define _CLLTK_TYPE_IS_FLEX(_I_, _X_) \ + _Generic((_X_), \ + _CLLTK_GENERIC_CASE(char, false), \ + _CLLTK_GENERIC_CASE(uint8_t, false), \ + _CLLTK_ONLY_LINUX(_CLLTK_GENERIC_CASE(int8_t, _clltk_argument_sint8), ) \ + _CLLTK_GENERIC_CASE(uint16_t, false), \ + _CLLTK_GENERIC_CASE(int16_t, false), \ + _CLLTK_GENERIC_CASE(uint32_t, false), \ + _CLLTK_GENERIC_CASE(int32_t, false), \ + _CLLTK_GENERIC_CASE(uint64_t, false), \ + _CLLTK_GENERIC_CASE(int64_t, false), \ + _CLLTK_GENERIC_CASE(__uint128_t, false), \ + _CLLTK_GENERIC_CASE(__int128_t, false), \ + _CLLTK_GENERIC_CASE(float, false), \ + _CLLTK_GENERIC_CASE(double, false), \ + _CLLTK_GENERIC_CASE(void *, false), \ + _CLLTK_GENERIC_CASE(char *, true), \ + _CLLTK_GENERIC_CASE(const void *, false), \ + _CLLTK_GENERIC_CASE(const char *, true), \ default: false) #else -#define _CLLTK_TYPE_IS_FLEX(_I_, _X_) \ - _Generic((_X_), \ - _CLLTK_GENERIC_CASE(char, false), \ - _CLLTK_GENERIC_CASE(uint8_t, false), \ - _CLLTK_GENERIC_CASE(int8_t, false), \ - _CLLTK_GENERIC_CASE(uint16_t, false), \ - _CLLTK_GENERIC_CASE(int16_t, false), \ - _CLLTK_GENERIC_CASE(uint32_t, false), \ - _CLLTK_GENERIC_CASE(int32_t, false), \ - _CLLTK_GENERIC_CASE(uint64_t, false), \ - _CLLTK_GENERIC_CASE(int64_t, false), \ - _CLLTK_GENERIC_CASE(signed long long, false), \ - _CLLTK_GENERIC_CASE(unsigned long long, false), \ - _CLLTK_GENERIC_CASE(__uint128_t, false), \ - _CLLTK_GENERIC_CASE(__int128_t, false), \ - _CLLTK_GENERIC_CASE(float, false), \ - _CLLTK_GENERIC_CASE(double, false), \ - _CLLTK_GENERIC_CASE(void *, false), \ - _CLLTK_GENERIC_CASE(char *, true), \ - _CLLTK_GENERIC_CASE(const void *, false), \ - _CLLTK_GENERIC_CASE(const char *, true), \ +#define _CLLTK_TYPE_IS_FLEX(_I_, _X_) \ + _Generic((_X_), \ + _CLLTK_GENERIC_CASE(char, false), \ + _CLLTK_GENERIC_CASE(uint8_t, false), \ + _CLLTK_ONLY_LINUX(_CLLTK_GENERIC_CASE(int8_t, _clltk_argument_sint8), ) \ + _CLLTK_GENERIC_CASE(uint16_t, false), \ + _CLLTK_GENERIC_CASE(int16_t, false), \ + _CLLTK_GENERIC_CASE(uint32_t, false), \ + _CLLTK_GENERIC_CASE(int32_t, false), \ + _CLLTK_GENERIC_CASE(uint64_t, false), \ + _CLLTK_GENERIC_CASE(int64_t, false), \ + _CLLTK_GENERIC_CASE(signed long long, false), \ + _CLLTK_GENERIC_CASE(unsigned long long, false), \ + _CLLTK_GENERIC_CASE(__uint128_t, false), \ + _CLLTK_GENERIC_CASE(__int128_t, false), \ + _CLLTK_GENERIC_CASE(float, false), \ + _CLLTK_GENERIC_CASE(double, false), \ + _CLLTK_GENERIC_CASE(void *, false), \ + _CLLTK_GENERIC_CASE(char *, true), \ + _CLLTK_GENERIC_CASE(const void *, false), \ + _CLLTK_GENERIC_CASE(const char *, true), \ default: false) #endif diff --git a/tracing_library/include/CommonLowLevelTracingKit/tracing/_macros.h b/tracing_library/include/CommonLowLevelTracingKit/tracing/_macros.h index f623278..c947446 100644 --- a/tracing_library/include/CommonLowLevelTracingKit/tracing/_macros.h +++ b/tracing_library/include/CommonLowLevelTracingKit/tracing/_macros.h @@ -131,6 +131,12 @@ __attribute__((always_inline)) static inline constexpr auto _clltk_cast(T value) _VALUE_ #endif +#ifdef __linux__ +#define _CLLTK_ONLY_LINUX(...) __VA_ARGS__ +#else +#define _CLLTK_ONLY_LINUX(...) +#endif + #define _CLLTK_STR_INTERNAL(...) #__VA_ARGS__ #define _CLLTK_STR(...) _CLLTK_STR_INTERNAL(__VA_ARGS__) diff --git a/tracing_library/source/abstraction/CMakeLists.txt b/tracing_library/source/abstraction/CMakeLists.txt index 0168afa..8eb98ed 100644 --- a/tracing_library/source/abstraction/CMakeLists.txt +++ b/tracing_library/source/abstraction/CMakeLists.txt @@ -7,13 +7,13 @@ target_include_directories(clltk_tracing_abstraction_interface find_package(Threads REQUIRED) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "SunOS") add_library(clltk_tracing_abstraction OBJECT - linux_user_space/file.c - linux_user_space/sync.c - linux_user_space/info.c - linux_user_space/error.c - linux_user_space/memory.c + unix_user_space/file.c + unix_user_space/sync.c + unix_user_space/info.c + unix_user_space/error.c + unix_user_space/memory.c ) target_link_libraries(clltk_tracing_abstraction PRIVATE diff --git a/tracing_library/source/abstraction/linux_user_space/error.c b/tracing_library/source/abstraction/unix_user_space/error.c similarity index 100% rename from tracing_library/source/abstraction/linux_user_space/error.c rename to tracing_library/source/abstraction/unix_user_space/error.c diff --git a/tracing_library/source/abstraction/linux_user_space/file.c b/tracing_library/source/abstraction/unix_user_space/file.c similarity index 94% rename from tracing_library/source/abstraction/linux_user_space/file.c rename to tracing_library/source/abstraction/unix_user_space/file.c index 86c8fee..2ee1ced 100644 --- a/tracing_library/source/abstraction/linux_user_space/file.c +++ b/tracing_library/source/abstraction/unix_user_space/file.c @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -231,9 +232,11 @@ file_t *file_create_temp(const char *final_name, const size_t file_size) ERROR_AND_EXIT("fail to mmap temp file %s with %s", file->path, strerror(errno)); } +#ifdef __linux__ if (madvise(file->mmapped.ptr, file_size, MADV_DODUMP) == -1) { ERROR_AND_EXIT("fail to madvise temp file %s with %s", file->path, strerror(errno)); } +#endif file->mmapped.size = file_size; @@ -332,7 +335,7 @@ file_t *file_temp_to_final(file_t **temp_file) snprintf(path, sizeof(path), "%s/%.*s" EXTENSION, get_root_path(), name_len, name); // rename file to final name - if (linkat(AT_FDCWD, old_file->path, AT_FDCWD, path, 0) == -1) { + if (linkat((int)AT_FDCWD, old_file->path, (int)AT_FDCWD, path, 0) == -1) { if (errno != EEXIST) { ERROR_AND_EXIT("renameing failed with \"%s\"(%d) for file %s to %s", strerror(errno), errno, old_file->path, path); @@ -369,18 +372,20 @@ void file_reset(void) return; } struct dirent *iterator = NULL; - + struct stat file_stat; // loop over all files in path while ((iterator = readdir(directory)) != NULL) { - if (iterator->d_type != DT_REG) - continue; - const char *name = iterator->d_name; - const char *ending = strrchr(name, '.'); - if (ending && !strcmp(ending, EXTENSION)) { - char path[PATH_MAX]; - snprintf(path, sizeof(path), "%s/%s", root, name); - if (0 != unlink(path)) - ERROR_AND_EXIT("remove %s at %s failed", name, root); + if (fstatat(dirfd(directory), iterator->d_name, &file_stat, AT_SYMLINK_NOFOLLOW) == 0) { + if (S_ISDIR(file_stat.st_mode)) + continue; + const char *name = iterator->d_name; + const char *ending = strrchr(name, '.'); + if (ending && !strcmp(ending, EXTENSION)) { + char path[PATH_MAX]; + snprintf(path, sizeof(path), "%s/%s", root, name); + if (0 != unlink(path)) + ERROR_AND_EXIT("remove %s at %s failed", name, root); + } } } closedir(directory); diff --git a/tracing_library/source/abstraction/linux_user_space/info.c b/tracing_library/source/abstraction/unix_user_space/info.c similarity index 90% rename from tracing_library/source/abstraction/linux_user_space/info.c rename to tracing_library/source/abstraction/unix_user_space/info.c index fcc8541..f5337a2 100644 --- a/tracing_library/source/abstraction/linux_user_space/info.c +++ b/tracing_library/source/abstraction/unix_user_space/info.c @@ -8,6 +8,9 @@ #include #include #include +#ifdef __illumos__ +#include +#endif __thread _Atomic uint32_t cached_pid; __thread _Atomic uint32_t cached_tid; @@ -19,7 +22,11 @@ void update_cache(void) atomic_store(&cached_pid, value); } { +#ifdef __linux__ const uint32_t value = (uint32_t)syscall(SYS_gettid); +#elif defined(__illumos__) + const uint32_t value = (uint32_t)_lwp_self(); +#endif atomic_store(&cached_tid, value); } } diff --git a/tracing_library/source/abstraction/linux_user_space/memory.c b/tracing_library/source/abstraction/unix_user_space/memory.c similarity index 100% rename from tracing_library/source/abstraction/linux_user_space/memory.c rename to tracing_library/source/abstraction/unix_user_space/memory.c diff --git a/tracing_library/source/abstraction/linux_user_space/sync.c b/tracing_library/source/abstraction/unix_user_space/sync.c similarity index 100% rename from tracing_library/source/abstraction/linux_user_space/sync.c rename to tracing_library/source/abstraction/unix_user_space/sync.c