From bc8c23ce0f265f20d93bdaa87f1c546cf5f0f1ec Mon Sep 17 00:00:00 2001 From: Zuzana Baranova <xbaranov@fi.muni.cz> Date: Sun, 23 Jun 2019 17:45:40 +0000 Subject: [PATCH] CC: Provide stddef.h as a true compiler builtin. --- divine/CMakeLists.txt | 5 +- divine/cc/cc1.cpp | 4 ++ divine/cc/native.cpp | 1 + divine/cc/stddef.h | 159 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 divine/cc/stddef.h diff --git a/divine/CMakeLists.txt b/divine/CMakeLists.txt index 0185c362c..59112f58d 100644 --- a/divine/CMakeLists.txt +++ b/divine/CMakeLists.txt @@ -31,10 +31,13 @@ include_directories( SYSTEM ${DIVINE_SYS_INCLUDES} ) add_definitions( ${MPI_COMPILE_FLAGS} ${LLVM_COMPILE_FLAGS} ) add_definitions( ${DIVINE_DEFINES} ) +stringify( cc ${divine_SOURCE_DIR}/divine/cc stddef.h ) + # add_library( divine-ss ${CPP_ss} ) add_library( divine-ui ${CPP_ui} ${VERSION_FILE} "flags-generated.cpp" ) +add_library( divine-cc ${CPP_cc} ${cc_FILES} ) add_dependencies( divine-ui divine-version ) -foreach( D cc ltl mc smt vm dbg ) +foreach( D ltl mc smt vm dbg ) add_library( divine-${D} ${CPP_${D}} ) endforeach() diff --git a/divine/cc/cc1.cpp b/divine/cc/cc1.cpp index 01f3f0c37..aa3bd512a 100644 --- a/divine/cc/cc1.cpp +++ b/divine/cc/cc1.cpp @@ -32,6 +32,8 @@ DIVINE_UNRELAX_WARNINGS #include <divine/cc/cc1.hpp> #include <lart/divine/vaarg.h> +namespace divine::str::cc { extern const std::string_view stddef_h; } + namespace divine::cc { class GetPreprocessedAction : public clang::PreprocessorFrontendAction @@ -77,6 +79,8 @@ namespace divine::cc overlayFS->pushOverlay( divineVFS ); if ( !ctx ) ctx.reset( new llvm::LLVMContext ); + + mapVirtualFile( "/builtin/stddef.h", ::divine::str::cc::stddef_h ); } CC1::~CC1() { } diff --git a/divine/cc/native.cpp b/divine/cc/native.cpp index e7e53810b..8b9720b89 100644 --- a/divine/cc/native.cpp +++ b/divine/cc/native.cpp @@ -38,6 +38,7 @@ namespace divine::cc driver->commonFlags.begin(), driver->commonFlags.end() ); _clang.allowIncludePath( "/" ); + _po.opts.insert( _po.opts.end(), { "-isystem", "/builtin" } ); } int Native::compile_files() diff --git a/divine/cc/stddef.h b/divine/cc/stddef.h new file mode 100644 index 000000000..ff1859318 --- /dev/null +++ b/divine/cc/stddef.h @@ -0,0 +1,159 @@ +/*===---- stddef.h - Basic type definitions --------------------------------=== + * + * Copyright (c) 2008 Eli Friedman + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + *===-----------------------------------------------------------------------=== + */ + +#if !defined(__STDDEF_H) || defined(__need_ptrdiff_t) || \ + defined(__need_size_t) || defined(__need_wchar_t) || \ + defined(__need_NULL) || defined(__need_wint_t) + +#if !defined(__need_ptrdiff_t) && !defined(__need_size_t) && \ + !defined(__need_wchar_t) && !defined(__need_NULL) && \ + !defined(__need_wint_t) +/* Always define miscellaneous pieces when modules are available. */ +#if !__has_feature(modules) +#define __STDDEF_H +#endif +#define __need_ptrdiff_t +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#define __need_STDDEF_H_misc +/* __need_wint_t is intentionally not defined here. */ +#endif + +#if defined(__need_ptrdiff_t) +#if !defined(_PTRDIFF_T) || __has_feature(modules) +/* Always define ptrdiff_t when modules are available. */ +#if !__has_feature(modules) +#define _PTRDIFF_T +#endif +typedef __PTRDIFF_TYPE__ ptrdiff_t; +#endif +#undef __need_ptrdiff_t +#endif /* defined(__need_ptrdiff_t) */ + +#if defined(__need_size_t) +#if !defined(_SIZE_T) || __has_feature(modules) +/* Always define size_t when modules are available. */ +#if !__has_feature(modules) +#define _SIZE_T +#endif +typedef __SIZE_TYPE__ size_t; +#endif +#undef __need_size_t +#endif /*defined(__need_size_t) */ + +#if defined(__need_STDDEF_H_misc) +/* ISO9899:2011 7.20 (C11 Annex K): Define rsize_t if __STDC_WANT_LIB_EXT1__ is + * enabled. */ +#if (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 && \ + !defined(_RSIZE_T)) || __has_feature(modules) +/* Always define rsize_t when modules are available. */ +#if !__has_feature(modules) +#define _RSIZE_T +#endif +typedef __SIZE_TYPE__ rsize_t; +#endif +#endif /* defined(__need_STDDEF_H_misc) */ + +#if defined(__need_wchar_t) +#ifndef __cplusplus +/* Always define wchar_t when modules are available. */ +#if !defined(_WCHAR_T) || __has_feature(modules) +#if !__has_feature(modules) +#define _WCHAR_T +#if defined(_MSC_EXTENSIONS) +#define _WCHAR_T_DEFINED +#endif +#endif +typedef __WCHAR_TYPE__ wchar_t; +#endif +#endif +#undef __need_wchar_t +#endif /* defined(__need_wchar_t) */ + +#if defined(__need_NULL) +#undef NULL +#ifdef __cplusplus +# if !defined(__MINGW32__) && !defined(_MSC_VER) +# define NULL __null +# else +# define NULL 0 +# endif +#else +# define NULL ((void*)0) +#endif +#ifdef __cplusplus +#if defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED) +namespace std { typedef decltype(nullptr) nullptr_t; } +using ::std::nullptr_t; +#endif +#endif +#undef __need_NULL +#endif /* defined(__need_NULL) */ + +#if defined(__need_STDDEF_H_misc) +#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L +/*#include "__stddef_max_align_t.h"*/ + +#ifndef __CLANG_MAX_ALIGN_T_DEFINED +#define __CLANG_MAX_ALIGN_T_DEFINED + +#if defined(_MSC_VER) +typedef double max_align_t; +#elif defined(__APPLE__) +typedef long double max_align_t; +#else +// Define 'max_align_t' to match the GCC definition. +typedef struct { + long long __clang_max_align_nonce1 + __attribute__((__aligned__(__alignof__(long long)))); + long double __clang_max_align_nonce2 + __attribute__((__aligned__(__alignof__(long double)))); +} max_align_t; +#endif + +#endif +/************************/ + + +#endif +#define offsetof(t, d) __builtin_offsetof(t, d) +#undef __need_STDDEF_H_misc +#endif /* defined(__need_STDDEF_H_misc) */ + +/* Some C libraries expect to see a wint_t here. Others (notably MinGW) will use +__WINT_TYPE__ directly; accommodate both by requiring __need_wint_t */ +#if defined(__need_wint_t) +/* Always define wint_t when modules are available. */ +#if !defined(_WINT_T) || __has_feature(modules) +#if !__has_feature(modules) +#define _WINT_T +#endif +typedef __WINT_TYPE__ wint_t; +#endif +#undef __need_wint_t +#endif /* __need_wint_t */ + +#endif -- GitLab