diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 2b885a2b8f..99b13c0355 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -389,6 +389,7 @@ HAIKU_PRIVATE_KERNEL_HEADERS = [ PrivateHeaders $(DOT) kernel libroot kernel/boot/platform/$(HAIKU_BOOT_PLATFORM) ] [ ArchHeaders $(HAIKU_ARCH) ] + [ FDirName $(HAIKU_COMMON_DEBUG_OBJECT_DIR) system kernel ] $(HAIKU_PRIVATE_SYSTEM_HEADERS) ; diff --git a/headers/private/kernel/kernel_c++_structs.h b/headers/private/kernel/kernel_c++_structs.h new file mode 100644 index 0000000000..71819cba42 --- /dev/null +++ b/headers/private/kernel/kernel_c++_structs.h @@ -0,0 +1,24 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _KERNEL_KERNEL_CPP_STRUCTS_H +#define _KERNEL_KERNEL_CPP_STRUCTS_H + + +#include + +#include + // this is the generated defining macros for the structure sizes + + +// in C++ mode include the headers defining the structures +#ifdef __cplusplus +# include +#endif + +// in C mode define the structures +DEFINE_KERNEL_CPP_STRUCT(ConditionVariable) + + +#endif // _KERNEL_KERNEL_CPP_STRUCTS_H diff --git a/headers/private/kernel/util/kernel_c.h b/headers/private/kernel/util/kernel_c.h new file mode 100644 index 0000000000..e4f79b46d3 --- /dev/null +++ b/headers/private/kernel/util/kernel_c.h @@ -0,0 +1,31 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _KERNEL_UTIL_KERNEL_C_H +#define _KERNEL_UTIL_KERNEL_C_H + + +/*! Defines a structure that has the size of a certain C++ structure. + \param name The name of the C++ structure. + \param flatName The name of the structure to be defined. +*/ +#define DEFINE_FLAT_KERNEL_CPP_STRUCT(name, flatName) \ + struct flatName { \ + char bytes[_KERNEL_CPP_STRUCT_SIZE_##name]; \ + }; + + +/*! In C mode DEFINE_KERNEL_CPP_STRUCT() defines a struct \a name with the + size of the C++ structure of the same name. In C++ it is a no-op. +*/ +#ifdef __cplusplus +# define DEFINE_KERNEL_CPP_STRUCT(name) +#else +# define DEFINE_KERNEL_CPP_STRUCT(name) \ + DEFINE_FLAT_KERNEL_CPP_STRUCT(name, name) \ + typedef struct name name; +#endif + + +#endif /* _KERNEL_UTIL_KERNEL_C_H */ diff --git a/src/system/kernel/Jamfile b/src/system/kernel/Jamfile index f0267702f6..d6da3f3e1e 100644 --- a/src/system/kernel/Jamfile +++ b/src/system/kernel/Jamfile @@ -63,6 +63,14 @@ KernelMergeObject kernel_core.o : : $(TARGET_KERNEL_PIC_CCFLAGS) ; +# Generate the header defining macros for C++ structure sizes. +local kernelC++StructSizesHeader = [ FGristFiles kernel_c++_struct_sizes.h ] ; +TARGET_HDRS on $(kernelC++StructSizesHeader) + = [ on $(kernelC++StructSizesHeader) return $(TARGET_HDRS) ] + $(TARGET_PRIVATE_KERNEL_HEADERS) ; +CreateAsmStructOffsetsHeader $(kernelC++StructSizesHeader) + : kernel_c++_structs.cpp ; + # We need to specify the dependency on the generated syscalls files explicitly. Includes [ FGristFiles syscalls.cpp ] : syscall_dispatcher.h syscall_table.h diff --git a/src/system/kernel/kernel_c++_structs.cpp b/src/system/kernel/kernel_c++_structs.cpp new file mode 100644 index 0000000000..f31d27cc6e --- /dev/null +++ b/src/system/kernel/kernel_c++_structs.cpp @@ -0,0 +1,24 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include + + +// NOTE: Don't include , since that would result in a +// circular dependency. + + +#define DEFINE_SIZE_MACRO(name) \ + DEFINE_COMPUTED_ASM_MACRO(_KERNEL_CPP_STRUCT_SIZE_##name, sizeof(name)); + + +void +dummy() +{ + DEFINE_SIZE_MACRO(ConditionVariable) +}