Skip to content
Merged
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
8 changes: 7 additions & 1 deletion VERSION.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
6 changes: 6 additions & 0 deletions examples/complex_cpp/complex_cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -213,6 +218,7 @@ void inline_functions(void)
inline_func();
static_inline_func();
}
#endif

CLLTK_TRACEBUFFER(NAMESPACE_FUNCTIONS, 4096);
namespace test
Expand Down
10 changes: 9 additions & 1 deletion examples/process_threads/process_threads.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,22 @@
#include <stdint.h>
#include <string>
#include <sys/wait.h>
#include <syscall.h>
#include <thread>
#include <unistd.h>

#ifdef __linux__
#include <syscall.h>
pid_t gettid(void)
{
return (pid_t)syscall(SYS_gettid);
}
#elif defined(__illumos__)
#include <sys/lwp.h>
pid_t gettid(void)
{
return (pid_t)_lwp_self();
}
#endif

CLLTK_TRACEBUFFER(ProcessAndThread, 256 * 1024);

Expand Down
11 changes: 7 additions & 4 deletions tracing_library/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
164 changes: 82 additions & 82 deletions tracing_library/include/CommonLowLevelTracingKit/tracing/_arguments.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -175,48 +175,48 @@ template <typename T> 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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
12 changes: 6 additions & 6 deletions tracing_library/source/abstraction/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <sys/stat.h>

#include <dirent.h>
#include <limits.h>
#include <unistd.h>

#include <inttypes.h>
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
#include <sys/syscall.h>
#include <time.h>
#include <unistd.h>
#ifdef __illumos__
#include <sys/lwp.h>
#endif

__thread _Atomic uint32_t cached_pid;
__thread _Atomic uint32_t cached_tid;
Expand All @@ -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);
}
}
Expand Down