fix up msvc stuff to make it work on linux and macos too
parent
67021e2bff
commit
57ea6e8c9f
|
@ -1,9 +1,3 @@
|
||||||
zig-cache/
|
zig-cache/
|
||||||
build/
|
build/
|
||||||
build-release/
|
build-*/
|
||||||
build-windows/
|
|
||||||
build-llvm4-debug/
|
|
||||||
build-llvm5-debug/
|
|
||||||
/.cproject
|
|
||||||
/.project
|
|
||||||
/.settings/
|
|
||||||
|
|
122
CMakeLists.txt
122
CMakeLists.txt
|
@ -26,86 +26,11 @@ option(ZIG_TEST_COVERAGE "Build Zig with test coverage instrumentation" OFF)
|
||||||
# git log -p -- deps/lld
|
# git log -p -- deps/lld
|
||||||
option(ZIG_FORCE_EXTERNAL_LLD "If your system has the LLD patches use it instead of the embedded LLD" OFF)
|
option(ZIG_FORCE_EXTERNAL_LLD "If your system has the LLD patches use it instead of the embedded LLD" OFF)
|
||||||
|
|
||||||
find_package(LLVM REQUIRED CONFIG)
|
find_package(llvm)
|
||||||
include_directories(${LLVM_INCLUDE_DIRS})
|
include_directories(${LLVM_INCLUDE_DIRS})
|
||||||
|
|
||||||
# TODO: this currently doesn't work, it currently defines UNICODE but zig
|
find_package(clang)
|
||||||
# uses MBCS
|
|
||||||
#add_definitions(${LLVM_DEFINITIONS})
|
|
||||||
|
|
||||||
link_directories(${LLVM_LIBRARY_DIRS})
|
|
||||||
llvm_map_components_to_libnames(LLVM_LIBRARIES
|
|
||||||
LTO
|
|
||||||
Symbolize
|
|
||||||
XCoreDisassembler
|
|
||||||
XCoreCodeGen
|
|
||||||
XCoreAsmPrinter
|
|
||||||
SystemZDisassembler
|
|
||||||
SystemZCodeGen
|
|
||||||
SystemZAsmParser
|
|
||||||
SystemZAsmPrinter
|
|
||||||
SparcDisassembler
|
|
||||||
SparcCodeGen
|
|
||||||
SparcAsmParser
|
|
||||||
SparcAsmPrinter
|
|
||||||
PowerPCDisassembler
|
|
||||||
PowerPCCodeGen
|
|
||||||
PowerPCAsmParser
|
|
||||||
PowerPCAsmPrinter
|
|
||||||
NVPTXCodeGen
|
|
||||||
NVPTXAsmPrinter
|
|
||||||
MSP430CodeGen
|
|
||||||
MSP430AsmPrinter
|
|
||||||
MipsDisassembler
|
|
||||||
MipsCodeGen
|
|
||||||
MipsAsmParser
|
|
||||||
MipsAsmPrinter
|
|
||||||
LanaiDisassembler
|
|
||||||
LanaiCodeGen
|
|
||||||
LanaiAsmParser
|
|
||||||
LanaiAsmPrinter
|
|
||||||
HexagonDisassembler
|
|
||||||
HexagonCodeGen
|
|
||||||
HexagonAsmParser
|
|
||||||
BPFDisassembler
|
|
||||||
BPFCodeGen
|
|
||||||
BPFAsmPrinter
|
|
||||||
ARMDisassembler
|
|
||||||
ARMCodeGen
|
|
||||||
ARMAsmParser
|
|
||||||
ARMAsmPrinter
|
|
||||||
AMDGPUDisassembler
|
|
||||||
AMDGPUCodeGen
|
|
||||||
AMDGPUAsmParser
|
|
||||||
AMDGPUAsmPrinter
|
|
||||||
AArch64Disassembler
|
|
||||||
AArch64CodeGen
|
|
||||||
AArch64AsmParser
|
|
||||||
AArch64AsmPrinter
|
|
||||||
LibDriver
|
|
||||||
X86Disassembler
|
|
||||||
X86AsmParser
|
|
||||||
X86CodeGen
|
|
||||||
X86AsmPrinter
|
|
||||||
Core
|
|
||||||
)
|
|
||||||
|
|
||||||
find_package(CLANG REQUIRED CONFIG)
|
|
||||||
include_directories(${CLANG_INCLUDE_DIRS})
|
include_directories(${CLANG_INCLUDE_DIRS})
|
||||||
set(CLANG_LIBRARIES
|
|
||||||
clangFrontend
|
|
||||||
clangDriver
|
|
||||||
clangSerialization
|
|
||||||
clangSema
|
|
||||||
clangAnalysis
|
|
||||||
clangAST
|
|
||||||
clangParse
|
|
||||||
clangSema
|
|
||||||
clangBasic
|
|
||||||
clangEdit
|
|
||||||
clangLex
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if(ZIG_FORCE_EXTERNAL_LLD)
|
if(ZIG_FORCE_EXTERNAL_LLD)
|
||||||
find_package(lld)
|
find_package(lld)
|
||||||
|
@ -203,21 +128,21 @@ else()
|
||||||
add_library(embedded_lld_lib ${EMBEDDED_LLD_LIB_SOURCES})
|
add_library(embedded_lld_lib ${EMBEDDED_LLD_LIB_SOURCES})
|
||||||
add_library(embedded_lld_elf ${EMBEDDED_LLD_ELF_SOURCES})
|
add_library(embedded_lld_elf ${EMBEDDED_LLD_ELF_SOURCES})
|
||||||
add_library(embedded_lld_coff ${EMBEDDED_LLD_COFF_SOURCES})
|
add_library(embedded_lld_coff ${EMBEDDED_LLD_COFF_SOURCES})
|
||||||
if(MINGW)
|
if(MSVC)
|
||||||
set(UNIQUE_COMPILE_FLAGS "-fno-exceptions -fno-rtti -Wno-comment")
|
set(ZIG_LLD_COMPILE_FLAGS "-std=c++11")
|
||||||
elseif(MSVC)
|
else()
|
||||||
set(UNIQUE_COMPILE_FLAGS "-D_MSVC")
|
set(ZIG_LLD_COMPILE_FLAGS "-std=c++11 -fno-exceptions -fno-rtti -Wno-comment")
|
||||||
endif()
|
endif()
|
||||||
set_target_properties(embedded_lld_lib PROPERTIES
|
set_target_properties(embedded_lld_lib PROPERTIES
|
||||||
COMPILE_FLAGS "-std=c++11 ${UNIQUE_COMPILE_FLAGS}"
|
COMPILE_FLAGS ${ZIG_LLD_COMPILE_FLAGS}
|
||||||
LINK_FLAGS " "
|
LINK_FLAGS " "
|
||||||
)
|
)
|
||||||
set_target_properties(embedded_lld_elf PROPERTIES
|
set_target_properties(embedded_lld_elf PROPERTIES
|
||||||
COMPILE_FLAGS "-std=c++11 ${UNIQUE_COMPILE_FLAGS}"
|
COMPILE_FLAGS ${ZIG_LLD_COMPILE_FLAGS}
|
||||||
LINK_FLAGS " "
|
LINK_FLAGS " "
|
||||||
)
|
)
|
||||||
set_target_properties(embedded_lld_coff PROPERTIES
|
set_target_properties(embedded_lld_coff PROPERTIES
|
||||||
COMPILE_FLAGS "-std=c++11 ${UNIQUE_COMPILE_FLAGS}"
|
COMPILE_FLAGS ${ZIG_LLD_COMPILE_FLAGS}
|
||||||
LINK_FLAGS " "
|
LINK_FLAGS " "
|
||||||
)
|
)
|
||||||
target_include_directories(embedded_lld_lib PUBLIC
|
target_include_directories(embedded_lld_lib PUBLIC
|
||||||
|
@ -289,17 +214,20 @@ include_directories(
|
||||||
"${CMAKE_SOURCE_DIR}/src"
|
"${CMAKE_SOURCE_DIR}/src"
|
||||||
)
|
)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
if(MSVC)
|
||||||
if(MINGW)
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -W4")
|
||||||
|
elseif(MINGW)
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Werror -Wno-error=format= -Wno-error=format -Wno-error=format-extra-args")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Werror -Wno-error=format= -Wno-error=format -Wno-error=format-extra-args")
|
||||||
|
else()
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Werror -Wall")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(EXE_CFLAGS "-std=c++11")
|
if(MSVC)
|
||||||
if(MINGW)
|
set(EXE_CFLAGS "-std=c++11")
|
||||||
set(EXE_CFLAGS "${EXE_CFLAGS} -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fno-exceptions -fno-rtti -Werror=strict-prototypes -Werror=old-style-definition -Werror=type-limits -Wno-missing-braces")
|
else()
|
||||||
elseif(MSVC)
|
set(EXE_CFLAGS "-std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fno-exceptions -fno-rtti -Werror=strict-prototypes -Werror=old-style-definition -Werror=type-limits -Wno-missing-braces")
|
||||||
set(EXE_CFLAGS "${EXE_CFLAGS} -D_MSVC")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(EXE_LDFLAGS " ")
|
set(EXE_LDFLAGS " ")
|
||||||
if(ZIG_TEST_COVERAGE)
|
if(ZIG_TEST_COVERAGE)
|
||||||
set(EXE_CFLAGS "${EXE_CFLAGS} -fprofile-arcs -ftest-coverage")
|
set(EXE_CFLAGS "${EXE_CFLAGS} -fprofile-arcs -ftest-coverage")
|
||||||
|
@ -312,9 +240,6 @@ set_target_properties(zig PROPERTIES
|
||||||
LINK_FLAGS ${EXE_LDFLAGS}
|
LINK_FLAGS ${EXE_LDFLAGS}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(MINGW)
|
|
||||||
set(PLATFORM_LIBRARIES quadmath)
|
|
||||||
endif()
|
|
||||||
target_link_libraries(zig LINK_PUBLIC
|
target_link_libraries(zig LINK_PUBLIC
|
||||||
${CLANG_LIBRARIES}
|
${CLANG_LIBRARIES}
|
||||||
${LLD_LIBRARIES}
|
${LLD_LIBRARIES}
|
||||||
|
@ -322,11 +247,12 @@ target_link_libraries(zig LINK_PUBLIC
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
${CMAKE_THREAD_LIBS_INIT}
|
||||||
${PLATFORM_LIBRARIES}
|
${PLATFORM_LIBRARIES}
|
||||||
)
|
)
|
||||||
if(MINGW OR MSVC)
|
|
||||||
target_link_libraries(zig LINK_PUBLIC version)
|
|
||||||
endif()
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_link_libraries(zig LINK_PUBLIC "C:/Program Files (x86)/Microsoft Visual Studio 14.0/DIA SDK/lib/diaguids.lib")
|
target_link_libraries(zig LINK_PUBLIC version)
|
||||||
|
elseif(MINGW)
|
||||||
|
target_link_libraries(zig LINK_PUBLIC version quadmath)
|
||||||
|
else()
|
||||||
|
target_link_libraries(zig LINK_PUBLIC quadmath)
|
||||||
endif()
|
endif()
|
||||||
install(TARGETS zig DESTINATION bin)
|
install(TARGETS zig DESTINATION bin)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Copyright (c) 2016 Andrew Kelley
|
||||||
|
# This file is MIT licensed.
|
||||||
|
# See http://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
# CLANG_FOUND
|
||||||
|
# CLANG_INCLUDE_DIRS
|
||||||
|
# CLANG_LIBRARIES
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
find_package(CLANG REQUIRED CONFIG)
|
||||||
|
|
||||||
|
set(CLANG_LIBRARIES
|
||||||
|
clangFrontend
|
||||||
|
clangDriver
|
||||||
|
clangSerialization
|
||||||
|
clangSema
|
||||||
|
clangAnalysis
|
||||||
|
clangAST
|
||||||
|
clangParse
|
||||||
|
clangSema
|
||||||
|
clangBasic
|
||||||
|
clangEdit
|
||||||
|
clangLex
|
||||||
|
)
|
||||||
|
|
||||||
|
else()
|
||||||
|
find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h
|
||||||
|
PATHS
|
||||||
|
/usr/lib/llvm/5/include
|
||||||
|
/usr/lib/llvm-5.0/include
|
||||||
|
/mingw64/include)
|
||||||
|
|
||||||
|
macro(FIND_AND_ADD_CLANG_LIB _libname_)
|
||||||
|
string(TOUPPER ${_libname_} _prettylibname_)
|
||||||
|
find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_}
|
||||||
|
PATHS
|
||||||
|
/usr/lib/llvm/5/lib
|
||||||
|
/usr/lib/llvm-5.0/lib
|
||||||
|
/mingw64/lib
|
||||||
|
/c/msys64/mingw64/lib
|
||||||
|
c:\\msys64\\mingw64\\lib)
|
||||||
|
if(CLANG_${_prettylibname_}_LIB)
|
||||||
|
set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB})
|
||||||
|
endif()
|
||||||
|
endmacro(FIND_AND_ADD_CLANG_LIB)
|
||||||
|
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangFrontend)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangDriver)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangSerialization)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangSema)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangAnalysis)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangAST)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangParse)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangSema)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangBasic)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangEdit)
|
||||||
|
FIND_AND_ADD_CLANG_LIB(clangLex)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(CLANG DEFAULT_MSG CLANG_LIBRARIES CLANG_INCLUDE_DIRS)
|
||||||
|
|
||||||
|
mark_as_advanced(CLANG_INCLUDE_DIRS CLANG_LIBRARIES)
|
|
@ -0,0 +1,116 @@
|
||||||
|
# Copyright (c) 2014 Andrew Kelley
|
||||||
|
# This file is MIT licensed.
|
||||||
|
# See http://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
# LLVM_FOUND
|
||||||
|
# LLVM_INCLUDE_DIRS
|
||||||
|
# LLVM_LIBRARIES
|
||||||
|
# LLVM_LIBDIRS
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
find_package(LLVM REQUIRED CONFIG)
|
||||||
|
|
||||||
|
# TODO: this currently doesn't work, it currently defines UNICODE but zig
|
||||||
|
# uses MBCS
|
||||||
|
#add_definitions(${LLVM_DEFINITIONS})
|
||||||
|
|
||||||
|
link_directories(${LLVM_LIBRARY_DIRS})
|
||||||
|
llvm_map_components_to_libnames(LLVM_LIBRARIES
|
||||||
|
LTO
|
||||||
|
Symbolize
|
||||||
|
XCoreDisassembler
|
||||||
|
XCoreCodeGen
|
||||||
|
XCoreAsmPrinter
|
||||||
|
SystemZDisassembler
|
||||||
|
SystemZCodeGen
|
||||||
|
SystemZAsmParser
|
||||||
|
SystemZAsmPrinter
|
||||||
|
SparcDisassembler
|
||||||
|
SparcCodeGen
|
||||||
|
SparcAsmParser
|
||||||
|
SparcAsmPrinter
|
||||||
|
PowerPCDisassembler
|
||||||
|
PowerPCCodeGen
|
||||||
|
PowerPCAsmParser
|
||||||
|
PowerPCAsmPrinter
|
||||||
|
NVPTXCodeGen
|
||||||
|
NVPTXAsmPrinter
|
||||||
|
MSP430CodeGen
|
||||||
|
MSP430AsmPrinter
|
||||||
|
MipsDisassembler
|
||||||
|
MipsCodeGen
|
||||||
|
MipsAsmParser
|
||||||
|
MipsAsmPrinter
|
||||||
|
LanaiDisassembler
|
||||||
|
LanaiCodeGen
|
||||||
|
LanaiAsmParser
|
||||||
|
LanaiAsmPrinter
|
||||||
|
HexagonDisassembler
|
||||||
|
HexagonCodeGen
|
||||||
|
HexagonAsmParser
|
||||||
|
BPFDisassembler
|
||||||
|
BPFCodeGen
|
||||||
|
BPFAsmPrinter
|
||||||
|
ARMDisassembler
|
||||||
|
ARMCodeGen
|
||||||
|
ARMAsmParser
|
||||||
|
ARMAsmPrinter
|
||||||
|
AMDGPUDisassembler
|
||||||
|
AMDGPUCodeGen
|
||||||
|
AMDGPUAsmParser
|
||||||
|
AMDGPUAsmPrinter
|
||||||
|
AArch64Disassembler
|
||||||
|
AArch64CodeGen
|
||||||
|
AArch64AsmParser
|
||||||
|
AArch64AsmPrinter
|
||||||
|
LibDriver
|
||||||
|
X86Disassembler
|
||||||
|
X86AsmParser
|
||||||
|
X86CodeGen
|
||||||
|
X86AsmPrinter
|
||||||
|
Core
|
||||||
|
)
|
||||||
|
|
||||||
|
else()
|
||||||
|
find_program(LLVM_CONFIG_EXE
|
||||||
|
NAMES llvm-config-5.0 llvm-config
|
||||||
|
PATHS
|
||||||
|
"/mingw64/bin"
|
||||||
|
"/c/msys64/mingw64/bin"
|
||||||
|
"c:/msys64/mingw64/bin"
|
||||||
|
"C:/Libraries/llvm-5.0.0/bin")
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${LLVM_CONFIG_EXE} --libs
|
||||||
|
OUTPUT_VARIABLE LLVM_LIBRARIES
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${LLVM_CONFIG_EXE} --system-libs
|
||||||
|
OUTPUT_VARIABLE LLVM_SYSTEM_LIBS
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${LLVM_CONFIG_EXE} --libdir
|
||||||
|
OUTPUT_VARIABLE LLVM_LIBDIRS
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${LLVM_CONFIG_EXE} --includedir
|
||||||
|
OUTPUT_VARIABLE LLVM_INCLUDE_DIRS
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
find_library(LLVM_LIBRARY NAMES LLVM)
|
||||||
|
|
||||||
|
set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS})
|
||||||
|
|
||||||
|
if(LLVM_LIBRARY)
|
||||||
|
set(LLVM_LIBRARIES ${LLVM_LIBRARY})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(LLVM DEFAULT_MSG LLVM_LIBRARIES LLVM_INCLUDE_DIRS)
|
||||||
|
|
||||||
|
mark_as_advanced(LLVM_INCLUDE_DIRS LLVM_LIBRARIES LLVM_LIBDIRS)
|
|
@ -13,11 +13,8 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#if defined(_MSVC)
|
#if defined(_MSC_VER)
|
||||||
/*
|
// TODO support 128 bit floats with msvc
|
||||||
* For now this is a placeholder until a better solution comes along to
|
|
||||||
* support 128-bit floats with MSVC.
|
|
||||||
*/
|
|
||||||
typedef long double __float128;
|
typedef long double __float128;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -377,39 +377,30 @@ void bigint_read_twos_complement(BigInt *dest, const uint8_t *buf, size_t bit_co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_MSVC)
|
#if defined(_MSC_VER)
|
||||||
/*
|
|
||||||
* Inneficient implmentations for now
|
|
||||||
*/
|
|
||||||
static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
||||||
*result = op1 + op2;
|
*result = op1 + op2;
|
||||||
if(*result - op2 != op1) {
|
return *result < op1 || *result < op2;
|
||||||
return true; // overflow
|
|
||||||
}
|
|
||||||
return false; // no overflow
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool sub_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
static bool sub_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
||||||
*result = op1 - op2;
|
*result = op1 - op2;
|
||||||
if(*result > op1)
|
return *result > op1;
|
||||||
{
|
|
||||||
return true; // overflow
|
|
||||||
}
|
|
||||||
return false; // no overflow
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mul_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
bool mul_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
||||||
*result = op1 * op2;
|
*result = op1 * op2;
|
||||||
if(op1 <= op2) {
|
|
||||||
if(*result / op1 != op2) {
|
if (op1 == 0 || op2 == 0)
|
||||||
return true; // overflow
|
return false;
|
||||||
}
|
|
||||||
} else {
|
if (op1 > UINT64_MAX / op2)
|
||||||
if(*result / op2 != op1) {
|
return true;
|
||||||
return true; // overflow
|
|
||||||
}
|
if (op2 > UINT64_MAX / op1)
|
||||||
}
|
return true;
|
||||||
return false; // no overflow
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#if defined(_MSVC)
|
#if defined(_MSC_VER)
|
||||||
// TEMPORARY WORKAROUND FOR MSVC NOT SUPPORTING __int128
|
// TEMPORARY WORKAROUND FOR MSVC NOT SUPPORTING __int128
|
||||||
typedef long long int128_t;
|
typedef long long int128_t;
|
||||||
typedef unsigned long long uint128_t;
|
typedef unsigned long long uint128_t;
|
||||||
|
|
|
@ -24,7 +24,7 @@ struct Buf {
|
||||||
};
|
};
|
||||||
|
|
||||||
Buf *buf_sprintf(const char *format, ...)
|
Buf *buf_sprintf(const char *format, ...)
|
||||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
ATTRIBUTE_PRINTF(1, 2);
|
||||||
Buf *buf_vprintf(const char *format, va_list ap);
|
Buf *buf_vprintf(const char *format, va_list ap);
|
||||||
|
|
||||||
static inline size_t buf_len(Buf *buf) {
|
static inline size_t buf_len(Buf *buf) {
|
||||||
|
@ -124,7 +124,7 @@ static inline void buf_append_char(Buf *buf, uint8_t c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void buf_appendf(Buf *buf, const char *format, ...)
|
void buf_appendf(Buf *buf, const char *format, ...)
|
||||||
ATTRIBUTE_FORMAT(printf, 2, 3);
|
ATTRIBUTE_PRINTF(2, 3);
|
||||||
|
|
||||||
static inline bool buf_eql_mem(Buf *buf, const char *mem, size_t mem_len) {
|
static inline bool buf_eql_mem(Buf *buf, const char *mem, size_t mem_len) {
|
||||||
assert(buf->list.length);
|
assert(buf->list.length);
|
||||||
|
|
|
@ -5194,8 +5194,7 @@ void codegen_add_object(CodeGen *g, Buf *object_path) {
|
||||||
g->link_objects.append(object_path);
|
g->link_objects.append(object_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_MSVC)
|
// Must be coordinated with with CIntType enum
|
||||||
// MSVC doesn't seem to support "designators" for array initialization
|
|
||||||
static const char *c_int_type_names[] = {
|
static const char *c_int_type_names[] = {
|
||||||
"short",
|
"short",
|
||||||
"unsigned short",
|
"unsigned short",
|
||||||
|
@ -5206,18 +5205,6 @@ static const char *c_int_type_names[] = {
|
||||||
"long long",
|
"long long",
|
||||||
"unsigned long long",
|
"unsigned long long",
|
||||||
};
|
};
|
||||||
#else
|
|
||||||
static const char *c_int_type_names[] = {
|
|
||||||
[CIntTypeShort] = "short",
|
|
||||||
[CIntTypeUShort] = "unsigned short",
|
|
||||||
[CIntTypeInt] = "int",
|
|
||||||
[CIntTypeUInt] = "unsigned int",
|
|
||||||
[CIntTypeLong] = "long",
|
|
||||||
[CIntTypeULong] = "unsigned long",
|
|
||||||
[CIntTypeLongLong] = "long long",
|
|
||||||
[CIntTypeULongLong] = "unsigned long long",
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void get_c_type(CodeGen *g, TypeTableEntry *type_entry, Buf *out_buf) {
|
static void get_c_type(CodeGen *g, TypeTableEntry *type_entry, Buf *out_buf) {
|
||||||
assert(type_entry);
|
assert(type_entry);
|
||||||
|
|
|
@ -56,7 +56,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl);
|
||||||
static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl);
|
static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl);
|
||||||
|
|
||||||
|
|
||||||
ATTRIBUTE_FORMAT(printf, 3, 4)
|
ATTRIBUTE_PRINTF(3, 4)
|
||||||
static void emit_warning(Context *c, const SourceLocation &sl, const char *format, ...) {
|
static void emit_warning(Context *c, const SourceLocation &sl, const char *format, ...) {
|
||||||
if (!c->warnings_on) {
|
if (!c->warnings_on) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -24,8 +24,8 @@ struct ParseContext {
|
||||||
Buf *void_buf;
|
Buf *void_buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
ATTRIBUTE_FORMAT(printf, 4, 5)
|
ATTRIBUTE_PRINTF(4, 5)
|
||||||
LLVM_ATTRIBUTE_NORETURN
|
ATTRIBUTE_NORETURN
|
||||||
static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const char *format, ...) {
|
static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const char *format, ...) {
|
||||||
assert(node->type == NodeTypeAsmExpr);
|
assert(node->type == NodeTypeAsmExpr);
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ATTRIBUTE_FORMAT(printf, 3, 4)
|
ATTRIBUTE_PRINTF(3, 4)
|
||||||
LLVM_ATTRIBUTE_NORETURN
|
ATTRIBUTE_NORETURN
|
||||||
static void ast_error(ParseContext *pc, Token *token, const char *format, ...) {
|
static void ast_error(ParseContext *pc, Token *token, const char *format, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
|
@ -205,7 +205,7 @@ static void ast_buf_from_token(ParseContext *pc, Token *token, Buf *buf) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LLVM_ATTRIBUTE_NORETURN
|
ATTRIBUTE_NORETURN
|
||||||
static void ast_invalid_token_error(ParseContext *pc, Token *token) {
|
static void ast_invalid_token_error(ParseContext *pc, Token *token) {
|
||||||
Buf token_value = BUF_INIT;
|
Buf token_value = BUF_INIT;
|
||||||
ast_buf_from_token(pc, token, &token_value);
|
ast_buf_from_token(pc, token, &token_value);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include "tokenizer.hpp"
|
#include "tokenizer.hpp"
|
||||||
#include "errmsg.hpp"
|
#include "errmsg.hpp"
|
||||||
|
|
||||||
ATTRIBUTE_FORMAT(printf, 2, 3)
|
ATTRIBUTE_PRINTF(2, 3)
|
||||||
void ast_token_error(Token *token, const char *format, ...);
|
void ast_token_error(Token *token, const char *format, ...);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,46 +8,44 @@
|
||||||
#ifndef ZIG_QUADMATH_HPP
|
#ifndef ZIG_QUADMATH_HPP
|
||||||
#define ZIG_QUADMATH_HPP
|
#define ZIG_QUADMATH_HPP
|
||||||
|
|
||||||
#if defined(_MSVC)
|
#if defined(_MSC_VER)
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#endif
|
|
||||||
|
|
||||||
extern "C" {
|
static inline __float128 fmodq(__float128 a, __float128 b) {
|
||||||
#if defined(_MSVC)
|
return fmodl(a, b);
|
||||||
static __float128 fmodq(__float128 a, __float128 b)
|
}
|
||||||
{
|
|
||||||
return fmod(a, b);
|
static inline __float128 ceilq(__float128 a) {
|
||||||
}
|
return ceill(a);
|
||||||
static __float128 ceilq(__float128 a)
|
}
|
||||||
{
|
|
||||||
return ceil(a);
|
static inline __float128 floorq(__float128 a) {
|
||||||
}
|
return floorl(a);
|
||||||
static __float128 floorq(__float128 a)
|
}
|
||||||
{
|
|
||||||
return floor(a);
|
static inline __float128 strtoflt128(const char *s, char **sp) {
|
||||||
}
|
|
||||||
static __float128 strtoflt128(const char *s, char **sp)
|
|
||||||
{
|
|
||||||
return strtold(s, sp);
|
return strtold(s, sp);
|
||||||
}
|
}
|
||||||
static int quadmath_snprintf(char *s, size_t size, const char *format, ...)
|
|
||||||
{
|
static inline int quadmath_snprintf(char *s, size_t size, const char *format, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(format, args);
|
va_start(format, args);
|
||||||
int result = vsnprintf(s, size, format, args);
|
int result = vsnprintf(s, size, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
extern "C" {
|
||||||
__float128 fmodq(__float128 a, __float128 b);
|
__float128 fmodq(__float128 a, __float128 b);
|
||||||
__float128 ceilq(__float128 a);
|
__float128 ceilq(__float128 a);
|
||||||
__float128 floorq(__float128 a);
|
__float128 floorq(__float128 a);
|
||||||
__float128 strtoflt128 (const char *s, char **sp);
|
__float128 strtoflt128 (const char *s, char **sp);
|
||||||
int quadmath_snprintf (char *s, size_t size, const char *format, ...);
|
int quadmath_snprintf (char *s, size_t size, const char *format, ...);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -234,7 +234,7 @@ struct Tokenize {
|
||||||
BigInt significand;
|
BigInt significand;
|
||||||
};
|
};
|
||||||
|
|
||||||
ATTRIBUTE_FORMAT(printf, 2, 3)
|
ATTRIBUTE_PRINTF(2, 3)
|
||||||
static void tokenize_error(Tokenize *t, const char *format, ...) {
|
static void tokenize_error(Tokenize *t, const char *format, ...) {
|
||||||
t->state = TokenizeStateError;
|
t->state = TokenizeStateError;
|
||||||
|
|
||||||
|
|
65
src/util.hpp
65
src/util.hpp
|
@ -12,52 +12,57 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <llvm/Support/Compiler.h>
|
|
||||||
|
|
||||||
#include <new>
|
#include <new>
|
||||||
|
|
||||||
#if defined(_MSVC)
|
#if defined(_MSC_VER)
|
||||||
#define ATTRIBUTE_COLD
|
|
||||||
#define ATTRIBUTE_FORMAT(args)
|
#include <intrin.h>
|
||||||
static inline uint32_t popcnt(unsigned long long x)
|
|
||||||
{
|
#define ATTRIBUTE_COLD __declspec(noinline)
|
||||||
x -= ((x >> 1) & 0x55555555);
|
#define ATTRIBUTE_PRINTF(a, b)
|
||||||
x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
|
#define ATTRIBUTE_RETURNS_NOALIAS __declspec(restrict)
|
||||||
x = (((x >> 4) + x) & 0x0f0f0f0f);
|
#define ATTRIBUTE_NORETURN __declspec(noreturn)
|
||||||
x += (x >> 8);
|
|
||||||
x += (x >> 16);
|
static inline int clzll(unsigned long long mask) {
|
||||||
return x & 0x0000003f;
|
unsigned long lz;
|
||||||
}
|
#if defined(_WIN64)
|
||||||
static inline uint32_t clzll(unsigned long long x)
|
if (_BitScanReverse64(&lz, mask))
|
||||||
{
|
return static_cast<int>(63-lz);
|
||||||
x |= (x >> 1);
|
zig_unreachable();
|
||||||
x |= (x >> 2);
|
|
||||||
x |= (x >> 4);
|
|
||||||
x |= (x >> 8);
|
|
||||||
x |= (x >> 16);
|
|
||||||
return 32 - popcnt(x);
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
#define ATTRIBUTE_COLD __attribute__((cold))
|
if (_BitScanReverse(&lz, mask >> 32))
|
||||||
#define ATTRIBUTE_FORMAT(args) __attribute__((format (args)))
|
lz += 32;
|
||||||
#define clzll(x) __builtin_clzll(x)
|
else
|
||||||
|
_BitScanReverse(&lz, mask & 0xffffffff);
|
||||||
|
return 63 - lz;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ATTRIBUTE_COLD __attribute__((cold))
|
||||||
|
#define ATTRIBUTE_PRINTF(a, b) __attribute__((format(printf, a, b)))
|
||||||
|
#define ATTRIBUTE_RETURNS_NOALIAS __attribute__((__malloc__))
|
||||||
|
#define ATTRIBUTE_NORETURN __attribute__((noreturn))
|
||||||
|
#define clzll(x) __builtin_clzll(x)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BREAKPOINT __asm("int $0x03")
|
#define BREAKPOINT __asm("int $0x03")
|
||||||
|
|
||||||
LLVM_ATTRIBUTE_NOINLINE
|
|
||||||
ATTRIBUTE_COLD
|
ATTRIBUTE_COLD
|
||||||
ATTRIBUTE_FORMAT(printf, 1, 2)
|
ATTRIBUTE_NORETURN
|
||||||
|
ATTRIBUTE_PRINTF(1, 2)
|
||||||
void zig_panic(const char *format, ...);
|
void zig_panic(const char *format, ...);
|
||||||
|
|
||||||
ATTRIBUTE_COLD
|
ATTRIBUTE_COLD
|
||||||
LLVM_ATTRIBUTE_NOINLINE
|
ATTRIBUTE_NORETURN
|
||||||
static inline void zig_unreachable(void) {
|
static inline void zig_unreachable(void) {
|
||||||
zig_panic("unreachable");
|
zig_panic("unreachable");
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) {
|
ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) {
|
||||||
T *ptr = reinterpret_cast<T*>(malloc(count * sizeof(T)));
|
T *ptr = reinterpret_cast<T*>(malloc(count * sizeof(T)));
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
zig_panic("allocation failed");
|
zig_panic("allocation failed");
|
||||||
|
@ -65,7 +70,7 @@ LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate(size_t count) {
|
ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate(size_t count) {
|
||||||
T *ptr = reinterpret_cast<T*>(calloc(count, sizeof(T)));
|
T *ptr = reinterpret_cast<T*>(calloc(count, sizeof(T)));
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
zig_panic("allocation failed");
|
zig_panic("allocation failed");
|
||||||
|
|
Loading…
Reference in New Issue