| author | |
| committer | |
| log | 57ea6e8c9f204be6d38177024d3b8f1aba4e05b2 |
| tree | 0a9897aab096767288688216aa68d3809e2d77fe |
| parent | 67021e2bfff0b9caea432fd996031ab880afdbc5 |
15 files changed, 299 insertions(+), 222 deletions(-)
.gitignore+1-7| ... | @@ -1,9 +1,3 @@ | ... | @@ -1,9 +1,3 @@ |
| 1 | zig-cache/ | 1 | zig-cache/ |
| 2 | build/ | 2 | build/ |
| 3 | build-release/ | 3 | build-*/ |
| 4 | build-windows/ | ||
| 5 | build-llvm4-debug/ | ||
| 6 | build-llvm5-debug/ | ||
| 7 | /.cproject | ||
| 8 | /.project | ||
| 9 | /.settings/ |
CMakeLists.txt+25-99| ... | @@ -26,86 +26,11 @@ option(ZIG_TEST_COVERAGE "Build Zig with test coverage instrumentation" OFF) | ... | @@ -26,86 +26,11 @@ option(ZIG_TEST_COVERAGE "Build Zig with test coverage instrumentation" OFF) |
| 26 | # git log -p -- deps/lld | 26 | # git log -p -- deps/lld |
| 27 | option(ZIG_FORCE_EXTERNAL_LLD "If your system has the LLD patches use it instead of the embedded LLD" OFF) | 27 | option(ZIG_FORCE_EXTERNAL_LLD "If your system has the LLD patches use it instead of the embedded LLD" OFF) |
| 28 | 28 | ||
| 29 | find_package(LLVM REQUIRED CONFIG) | 29 | find_package(llvm) |
| 30 | include_directories(${LLVM_INCLUDE_DIRS}) | 30 | include_directories(${LLVM_INCLUDE_DIRS}) |
| 31 | 31 | ||
| 32 | # TODO: this currently doesn't work, it currently defines UNICODE but zig | 32 | find_package(clang) |
| 33 | # uses MBCS | ||
| 34 | #add_definitions(${LLVM_DEFINITIONS}) | ||
| 35 | |||
| 36 | link_directories(${LLVM_LIBRARY_DIRS}) | ||
| 37 | llvm_map_components_to_libnames(LLVM_LIBRARIES | ||
| 38 | LTO | ||
| 39 | Symbolize | ||
| 40 | XCoreDisassembler | ||
| 41 | XCoreCodeGen | ||
| 42 | XCoreAsmPrinter | ||
| 43 | SystemZDisassembler | ||
| 44 | SystemZCodeGen | ||
| 45 | SystemZAsmParser | ||
| 46 | SystemZAsmPrinter | ||
| 47 | SparcDisassembler | ||
| 48 | SparcCodeGen | ||
| 49 | SparcAsmParser | ||
| 50 | SparcAsmPrinter | ||
| 51 | PowerPCDisassembler | ||
| 52 | PowerPCCodeGen | ||
| 53 | PowerPCAsmParser | ||
| 54 | PowerPCAsmPrinter | ||
| 55 | NVPTXCodeGen | ||
| 56 | NVPTXAsmPrinter | ||
| 57 | MSP430CodeGen | ||
| 58 | MSP430AsmPrinter | ||
| 59 | MipsDisassembler | ||
| 60 | MipsCodeGen | ||
| 61 | MipsAsmParser | ||
| 62 | MipsAsmPrinter | ||
| 63 | LanaiDisassembler | ||
| 64 | LanaiCodeGen | ||
| 65 | LanaiAsmParser | ||
| 66 | LanaiAsmPrinter | ||
| 67 | HexagonDisassembler | ||
| 68 | HexagonCodeGen | ||
| 69 | HexagonAsmParser | ||
| 70 | BPFDisassembler | ||
| 71 | BPFCodeGen | ||
| 72 | BPFAsmPrinter | ||
| 73 | ARMDisassembler | ||
| 74 | ARMCodeGen | ||
| 75 | ARMAsmParser | ||
| 76 | ARMAsmPrinter | ||
| 77 | AMDGPUDisassembler | ||
| 78 | AMDGPUCodeGen | ||
| 79 | AMDGPUAsmParser | ||
| 80 | AMDGPUAsmPrinter | ||
| 81 | AArch64Disassembler | ||
| 82 | AArch64CodeGen | ||
| 83 | AArch64AsmParser | ||
| 84 | AArch64AsmPrinter | ||
| 85 | LibDriver | ||
| 86 | X86Disassembler | ||
| 87 | X86AsmParser | ||
| 88 | X86CodeGen | ||
| 89 | X86AsmPrinter | ||
| 90 | Core | ||
| 91 | ) | ||
| 92 | |||
| 93 | find_package(CLANG REQUIRED CONFIG) | ||
| 94 | include_directories(${CLANG_INCLUDE_DIRS}) | 33 | include_directories(${CLANG_INCLUDE_DIRS}) |
| 95 | set(CLANG_LIBRARIES | ||
| 96 | clangFrontend | ||
| 97 | clangDriver | ||
| 98 | clangSerialization | ||
| 99 | clangSema | ||
| 100 | clangAnalysis | ||
| 101 | clangAST | ||
| 102 | clangParse | ||
| 103 | clangSema | ||
| 104 | clangBasic | ||
| 105 | clangEdit | ||
| 106 | clangLex | ||
| 107 | ) | ||
| 108 | |||
| 109 | 34 | ||
| 110 | if(ZIG_FORCE_EXTERNAL_LLD) | 35 | if(ZIG_FORCE_EXTERNAL_LLD) |
| 111 | find_package(lld) | 36 | find_package(lld) |
| ... | @@ -203,21 +128,21 @@ else() | ... | @@ -203,21 +128,21 @@ else() |
| 203 | add_library(embedded_lld_lib ${EMBEDDED_LLD_LIB_SOURCES}) | 128 | add_library(embedded_lld_lib ${EMBEDDED_LLD_LIB_SOURCES}) |
| 204 | add_library(embedded_lld_elf ${EMBEDDED_LLD_ELF_SOURCES}) | 129 | add_library(embedded_lld_elf ${EMBEDDED_LLD_ELF_SOURCES}) |
| 205 | add_library(embedded_lld_coff ${EMBEDDED_LLD_COFF_SOURCES}) | 130 | add_library(embedded_lld_coff ${EMBEDDED_LLD_COFF_SOURCES}) |
| 206 | if(MINGW) | 131 | if(MSVC) |
| 207 | set(UNIQUE_COMPILE_FLAGS "-fno-exceptions -fno-rtti -Wno-comment") | 132 | set(ZIG_LLD_COMPILE_FLAGS "-std=c++11") |
| 208 | elseif(MSVC) | 133 | else() |
| 209 | set(UNIQUE_COMPILE_FLAGS "-D_MSVC") | 134 | set(ZIG_LLD_COMPILE_FLAGS "-std=c++11 -fno-exceptions -fno-rtti -Wno-comment") |
| 210 | endif() | 135 | endif() |
| 211 | set_target_properties(embedded_lld_lib PROPERTIES | 136 | set_target_properties(embedded_lld_lib PROPERTIES |
| 212 | COMPILE_FLAGS "-std=c++11 ${UNIQUE_COMPILE_FLAGS}" | 137 | COMPILE_FLAGS ${ZIG_LLD_COMPILE_FLAGS} |
| 213 | LINK_FLAGS " " | 138 | LINK_FLAGS " " |
| 214 | ) | 139 | ) |
| 215 | set_target_properties(embedded_lld_elf PROPERTIES | 140 | set_target_properties(embedded_lld_elf PROPERTIES |
| 216 | COMPILE_FLAGS "-std=c++11 ${UNIQUE_COMPILE_FLAGS}" | 141 | COMPILE_FLAGS ${ZIG_LLD_COMPILE_FLAGS} |
| 217 | LINK_FLAGS " " | 142 | LINK_FLAGS " " |
| 218 | ) | 143 | ) |
| 219 | set_target_properties(embedded_lld_coff PROPERTIES | 144 | set_target_properties(embedded_lld_coff PROPERTIES |
| 220 | COMPILE_FLAGS "-std=c++11 ${UNIQUE_COMPILE_FLAGS}" | 145 | COMPILE_FLAGS ${ZIG_LLD_COMPILE_FLAGS} |
| 221 | LINK_FLAGS " " | 146 | LINK_FLAGS " " |
| 222 | ) | 147 | ) |
| 223 | target_include_directories(embedded_lld_lib PUBLIC | 148 | target_include_directories(embedded_lld_lib PUBLIC |
| ... | @@ -289,17 +214,20 @@ include_directories( | ... | @@ -289,17 +214,20 @@ include_directories( |
| 289 | "${CMAKE_SOURCE_DIR}/src" | 214 | "${CMAKE_SOURCE_DIR}/src" |
| 290 | ) | 215 | ) |
| 291 | 216 | ||
| 292 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") | 217 | if(MSVC) |
| 293 | if(MINGW) | 218 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -W4") |
| 294 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Werror -Wno-error=format= -Wno-error=format -Wno-error=format-extra-args") | 219 | elseif(MINGW) |
| 220 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Werror -Wno-error=format= -Wno-error=format -Wno-error=format-extra-args") | ||
| 221 | else() | ||
| 222 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Werror -Wall") | ||
| 295 | endif() | 223 | endif() |
| 296 | 224 | ||
| 297 | set(EXE_CFLAGS "-std=c++11") | 225 | if(MSVC) |
| 298 | if(MINGW) | 226 | set(EXE_CFLAGS "-std=c++11") |
| 299 | 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") | 227 | else() |
| 300 | elseif(MSVC) | 228 | 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") |
| 301 | set(EXE_CFLAGS "${EXE_CFLAGS} -D_MSVC") | ||
| 302 | endif() | 229 | endif() |
| 230 | |||
| 303 | set(EXE_LDFLAGS " ") | 231 | set(EXE_LDFLAGS " ") |
| 304 | if(ZIG_TEST_COVERAGE) | 232 | if(ZIG_TEST_COVERAGE) |
| 305 | set(EXE_CFLAGS "${EXE_CFLAGS} -fprofile-arcs -ftest-coverage") | 233 | set(EXE_CFLAGS "${EXE_CFLAGS} -fprofile-arcs -ftest-coverage") |
| ... | @@ -312,9 +240,6 @@ set_target_properties(zig PROPERTIES | ... | @@ -312,9 +240,6 @@ set_target_properties(zig PROPERTIES |
| 312 | LINK_FLAGS ${EXE_LDFLAGS} | 240 | LINK_FLAGS ${EXE_LDFLAGS} |
| 313 | ) | 241 | ) |
| 314 | 242 | ||
| 315 | if(MINGW) | ||
| 316 | set(PLATFORM_LIBRARIES quadmath) | ||
| 317 | endif() | ||
| 318 | target_link_libraries(zig LINK_PUBLIC | 243 | target_link_libraries(zig LINK_PUBLIC |
| 319 | ${CLANG_LIBRARIES} | 244 | ${CLANG_LIBRARIES} |
| 320 | ${LLD_LIBRARIES} | 245 | ${LLD_LIBRARIES} |
| ... | @@ -322,11 +247,12 @@ target_link_libraries(zig LINK_PUBLIC | ... | @@ -322,11 +247,12 @@ target_link_libraries(zig LINK_PUBLIC |
| 322 | ${CMAKE_THREAD_LIBS_INIT} | 247 | ${CMAKE_THREAD_LIBS_INIT} |
| 323 | ${PLATFORM_LIBRARIES} | 248 | ${PLATFORM_LIBRARIES} |
| 324 | ) | 249 | ) |
| 325 | if(MINGW OR MSVC) | ||
| 326 | target_link_libraries(zig LINK_PUBLIC version) | ||
| 327 | endif() | ||
| 328 | if(MSVC) | 250 | if(MSVC) |
| 329 | target_link_libraries(zig LINK_PUBLIC "C:/Program Files (x86)/Microsoft Visual Studio 14.0/DIA SDK/lib/diaguids.lib") | 251 | target_link_libraries(zig LINK_PUBLIC version) |
| 252 | elseif(MINGW) | ||
| 253 | target_link_libraries(zig LINK_PUBLIC version quadmath) | ||
| 254 | else() | ||
| 255 | target_link_libraries(zig LINK_PUBLIC quadmath) | ||
| 330 | endif() | 256 | endif() |
| 331 | install(TARGETS zig DESTINATION bin) | 257 | install(TARGETS zig DESTINATION bin) |
| 332 | 258 |
cmake/Findclang.cmake created+63| ... | @@ -0,0 +1,63 @@ | ||
| 1 | # Copyright (c) 2016 Andrew Kelley | ||
| 2 | # This file is MIT licensed. | ||
| 3 | # See http://opensource.org/licenses/MIT | ||
| 4 | |||
| 5 | # CLANG_FOUND | ||
| 6 | # CLANG_INCLUDE_DIRS | ||
| 7 | # CLANG_LIBRARIES | ||
| 8 | |||
| 9 | if(MSVC) | ||
| 10 | find_package(CLANG REQUIRED CONFIG) | ||
| 11 | |||
| 12 | set(CLANG_LIBRARIES | ||
| 13 | clangFrontend | ||
| 14 | clangDriver | ||
| 15 | clangSerialization | ||
| 16 | clangSema | ||
| 17 | clangAnalysis | ||
| 18 | clangAST | ||
| 19 | clangParse | ||
| 20 | clangSema | ||
| 21 | clangBasic | ||
| 22 | clangEdit | ||
| 23 | clangLex | ||
| 24 | ) | ||
| 25 | |||
| 26 | else() | ||
| 27 | find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h | ||
| 28 | PATHS | ||
| 29 | /usr/lib/llvm/5/include | ||
| 30 | /usr/lib/llvm-5.0/include | ||
| 31 | /mingw64/include) | ||
| 32 | |||
| 33 | macro(FIND_AND_ADD_CLANG_LIB _libname_) | ||
| 34 | string(TOUPPER ${_libname_} _prettylibname_) | ||
| 35 | find_library(CLANG_${_prettylibname_}_LIB NAMES ${_libname_} | ||
| 36 | PATHS | ||
| 37 | /usr/lib/llvm/5/lib | ||
| 38 | /usr/lib/llvm-5.0/lib | ||
| 39 | /mingw64/lib | ||
| 40 | /c/msys64/mingw64/lib | ||
| 41 | c:\\msys64\\mingw64\\lib) | ||
| 42 | if(CLANG_${_prettylibname_}_LIB) | ||
| 43 | set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_${_prettylibname_}_LIB}) | ||
| 44 | endif() | ||
| 45 | endmacro(FIND_AND_ADD_CLANG_LIB) | ||
| 46 | |||
| 47 | FIND_AND_ADD_CLANG_LIB(clangFrontend) | ||
| 48 | FIND_AND_ADD_CLANG_LIB(clangDriver) | ||
| 49 | FIND_AND_ADD_CLANG_LIB(clangSerialization) | ||
| 50 | FIND_AND_ADD_CLANG_LIB(clangSema) | ||
| 51 | FIND_AND_ADD_CLANG_LIB(clangAnalysis) | ||
| 52 | FIND_AND_ADD_CLANG_LIB(clangAST) | ||
| 53 | FIND_AND_ADD_CLANG_LIB(clangParse) | ||
| 54 | FIND_AND_ADD_CLANG_LIB(clangSema) | ||
| 55 | FIND_AND_ADD_CLANG_LIB(clangBasic) | ||
| 56 | FIND_AND_ADD_CLANG_LIB(clangEdit) | ||
| 57 | FIND_AND_ADD_CLANG_LIB(clangLex) | ||
| 58 | endif() | ||
| 59 | |||
| 60 | include(FindPackageHandleStandardArgs) | ||
| 61 | find_package_handle_standard_args(CLANG DEFAULT_MSG CLANG_LIBRARIES CLANG_INCLUDE_DIRS) | ||
| 62 | |||
| 63 | mark_as_advanced(CLANG_INCLUDE_DIRS CLANG_LIBRARIES) | ||
cmake/Findllvm.cmake created+116| ... | @@ -0,0 +1,116 @@ | ||
| 1 | # Copyright (c) 2014 Andrew Kelley | ||
| 2 | # This file is MIT licensed. | ||
| 3 | # See http://opensource.org/licenses/MIT | ||
| 4 | |||
| 5 | # LLVM_FOUND | ||
| 6 | # LLVM_INCLUDE_DIRS | ||
| 7 | # LLVM_LIBRARIES | ||
| 8 | # LLVM_LIBDIRS | ||
| 9 | |||
| 10 | if(MSVC) | ||
| 11 | find_package(LLVM REQUIRED CONFIG) | ||
| 12 | |||
| 13 | # TODO: this currently doesn't work, it currently defines UNICODE but zig | ||
| 14 | # uses MBCS | ||
| 15 | #add_definitions(${LLVM_DEFINITIONS}) | ||
| 16 | |||
| 17 | link_directories(${LLVM_LIBRARY_DIRS}) | ||
| 18 | llvm_map_components_to_libnames(LLVM_LIBRARIES | ||
| 19 | LTO | ||
| 20 | Symbolize | ||
| 21 | XCoreDisassembler | ||
| 22 | XCoreCodeGen | ||
| 23 | XCoreAsmPrinter | ||
| 24 | SystemZDisassembler | ||
| 25 | SystemZCodeGen | ||
| 26 | SystemZAsmParser | ||
| 27 | SystemZAsmPrinter | ||
| 28 | SparcDisassembler | ||
| 29 | SparcCodeGen | ||
| 30 | SparcAsmParser | ||
| 31 | SparcAsmPrinter | ||
| 32 | PowerPCDisassembler | ||
| 33 | PowerPCCodeGen | ||
| 34 | PowerPCAsmParser | ||
| 35 | PowerPCAsmPrinter | ||
| 36 | NVPTXCodeGen | ||
| 37 | NVPTXAsmPrinter | ||
| 38 | MSP430CodeGen | ||
| 39 | MSP430AsmPrinter | ||
| 40 | MipsDisassembler | ||
| 41 | MipsCodeGen | ||
| 42 | MipsAsmParser | ||
| 43 | MipsAsmPrinter | ||
| 44 | LanaiDisassembler | ||
| 45 | LanaiCodeGen | ||
| 46 | LanaiAsmParser | ||
| 47 | LanaiAsmPrinter | ||
| 48 | HexagonDisassembler | ||
| 49 | HexagonCodeGen | ||
| 50 | HexagonAsmParser | ||
| 51 | BPFDisassembler | ||
| 52 | BPFCodeGen | ||
| 53 | BPFAsmPrinter | ||
| 54 | ARMDisassembler | ||
| 55 | ARMCodeGen | ||
| 56 | ARMAsmParser | ||
| 57 | ARMAsmPrinter | ||
| 58 | AMDGPUDisassembler | ||
| 59 | AMDGPUCodeGen | ||
| 60 | AMDGPUAsmParser | ||
| 61 | AMDGPUAsmPrinter | ||
| 62 | AArch64Disassembler | ||
| 63 | AArch64CodeGen | ||
| 64 | AArch64AsmParser | ||
| 65 | AArch64AsmPrinter | ||
| 66 | LibDriver | ||
| 67 | X86Disassembler | ||
| 68 | X86AsmParser | ||
| 69 | X86CodeGen | ||
| 70 | X86AsmPrinter | ||
| 71 | Core | ||
| 72 | ) | ||
| 73 | |||
| 74 | else() | ||
| 75 | find_program(LLVM_CONFIG_EXE | ||
| 76 | NAMES llvm-config-5.0 llvm-config | ||
| 77 | PATHS | ||
| 78 | "/mingw64/bin" | ||
| 79 | "/c/msys64/mingw64/bin" | ||
| 80 | "c:/msys64/mingw64/bin" | ||
| 81 | "C:/Libraries/llvm-5.0.0/bin") | ||
| 82 | |||
| 83 | execute_process( | ||
| 84 | COMMAND ${LLVM_CONFIG_EXE} --libs | ||
| 85 | OUTPUT_VARIABLE LLVM_LIBRARIES | ||
| 86 | OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| 87 | |||
| 88 | execute_process( | ||
| 89 | COMMAND ${LLVM_CONFIG_EXE} --system-libs | ||
| 90 | OUTPUT_VARIABLE LLVM_SYSTEM_LIBS | ||
| 91 | OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| 92 | |||
| 93 | execute_process( | ||
| 94 | COMMAND ${LLVM_CONFIG_EXE} --libdir | ||
| 95 | OUTPUT_VARIABLE LLVM_LIBDIRS | ||
| 96 | OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| 97 | |||
| 98 | execute_process( | ||
| 99 | COMMAND ${LLVM_CONFIG_EXE} --includedir | ||
| 100 | OUTPUT_VARIABLE LLVM_INCLUDE_DIRS | ||
| 101 | OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| 102 | |||
| 103 | find_library(LLVM_LIBRARY NAMES LLVM) | ||
| 104 | |||
| 105 | set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS}) | ||
| 106 | |||
| 107 | if(LLVM_LIBRARY) | ||
| 108 | set(LLVM_LIBRARIES ${LLVM_LIBRARY}) | ||
| 109 | endif() | ||
| 110 | endif() | ||
| 111 | |||
| 112 | |||
| 113 | include(FindPackageHandleStandardArgs) | ||
| 114 | find_package_handle_standard_args(LLVM DEFAULT_MSG LLVM_LIBRARIES LLVM_INCLUDE_DIRS) | ||
| 115 | |||
| 116 | mark_as_advanced(LLVM_INCLUDE_DIRS LLVM_LIBRARIES LLVM_LIBDIRS) | ||
src/bigfloat.hpp+2-5| ... | @@ -13,11 +13,8 @@ | ... | @@ -13,11 +13,8 @@ |
| 13 | #include <stdint.h> | 13 | #include <stdint.h> |
| 14 | #include <stddef.h> | 14 | #include <stddef.h> |
| 15 | 15 | ||
| 16 | #if defined(_MSVC) | 16 | #if defined(_MSC_VER) |
| 17 | /* | 17 | // TODO support 128 bit floats with msvc |
| 18 | * For now this is a placeholder until a better solution comes along to | ||
| 19 | * support 128-bit floats with MSVC. | ||
| 20 | */ | ||
| 21 | typedef long double __float128; | 18 | typedef long double __float128; |
| 22 | #endif | 19 | #endif |
| 23 | 20 |
src/bigint.cpp+14-23| ... | @@ -377,39 +377,30 @@ void bigint_read_twos_complement(BigInt *dest, const uint8_t *buf, size_t bit_co | ... | @@ -377,39 +377,30 @@ void bigint_read_twos_complement(BigInt *dest, const uint8_t *buf, size_t bit_co |
| 377 | } | 377 | } |
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | #if defined(_MSVC) | 380 | #if defined(_MSC_VER) |
| 381 | /* | ||
| 382 | * Inneficient implmentations for now | ||
| 383 | */ | ||
| 384 | static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { | 381 | static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { |
| 385 | *result = op1 + op2; | 382 | *result = op1 + op2; |
| 386 | if(*result - op2 != op1) { | 383 | return *result < op1 || *result < op2; |
| 387 | return true; // overflow | ||
| 388 | } | ||
| 389 | return false; // no overflow | ||
| 390 | } | 384 | } |
| 391 | 385 | ||
| 392 | static bool sub_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { | 386 | static bool sub_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { |
| 393 | *result = op1 - op2; | 387 | *result = op1 - op2; |
| 394 | if(*result > op1) | 388 | return *result > op1; |
| 395 | { | ||
| 396 | return true; // overflow | ||
| 397 | } | ||
| 398 | return false; // no overflow | ||
| 399 | } | 389 | } |
| 400 | 390 | ||
| 401 | bool mul_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { | 391 | bool mul_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { |
| 402 | *result = op1 * op2; | 392 | *result = op1 * op2; |
| 403 | if(op1 <= op2) { | 393 | |
| 404 | if(*result / op1 != op2) { | 394 | if (op1 == 0 || op2 == 0) |
| 405 | return true; // overflow | 395 | return false; |
| 406 | } | 396 | |
| 407 | } else { | 397 | if (op1 > UINT64_MAX / op2) |
| 408 | if(*result / op2 != op1) { | 398 | return true; |
| 409 | return true; // overflow | 399 | |
| 410 | } | 400 | if (op2 > UINT64_MAX / op1) |
| 411 | } | 401 | return true; |
| 412 | return false; // no overflow | 402 | |
| 403 | return false; | ||
| 413 | } | 404 | } |
| 414 | #else | 405 | #else |
| 415 | static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { | 406 | static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) { |
src/bigint.hpp+1-1| ... | @@ -11,7 +11,7 @@ | ... | @@ -11,7 +11,7 @@ |
| 11 | #include <stdint.h> | 11 | #include <stdint.h> |
| 12 | #include <stddef.h> | 12 | #include <stddef.h> |
| 13 | 13 | ||
| 14 | #if defined(_MSVC) | 14 | #if defined(_MSC_VER) |
| 15 | // TEMPORARY WORKAROUND FOR MSVC NOT SUPPORTING __int128 | 15 | // TEMPORARY WORKAROUND FOR MSVC NOT SUPPORTING __int128 |
| 16 | typedef long long int128_t; | 16 | typedef long long int128_t; |
| 17 | typedef unsigned long long uint128_t; | 17 | typedef unsigned long long uint128_t; |
src/buffer.hpp+2-2| ... | @@ -24,7 +24,7 @@ struct Buf { | ... | @@ -24,7 +24,7 @@ struct Buf { |
| 24 | }; | 24 | }; |
| 25 | 25 | ||
| 26 | Buf *buf_sprintf(const char *format, ...) | 26 | Buf *buf_sprintf(const char *format, ...) |
| 27 | ATTRIBUTE_FORMAT(printf, 1, 2); | 27 | ATTRIBUTE_PRINTF(1, 2); |
| 28 | Buf *buf_vprintf(const char *format, va_list ap); | 28 | Buf *buf_vprintf(const char *format, va_list ap); |
| 29 | 29 | ||
| 30 | static inline size_t buf_len(Buf *buf) { | 30 | static inline size_t buf_len(Buf *buf) { |
| ... | @@ -124,7 +124,7 @@ static inline void buf_append_char(Buf *buf, uint8_t c) { | ... | @@ -124,7 +124,7 @@ static inline void buf_append_char(Buf *buf, uint8_t c) { |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | void buf_appendf(Buf *buf, const char *format, ...) | 126 | void buf_appendf(Buf *buf, const char *format, ...) |
| 127 | ATTRIBUTE_FORMAT(printf, 2, 3); | 127 | ATTRIBUTE_PRINTF(2, 3); |
| 128 | 128 | ||
| 129 | static inline bool buf_eql_mem(Buf *buf, const char *mem, size_t mem_len) { | 129 | static inline bool buf_eql_mem(Buf *buf, const char *mem, size_t mem_len) { |
| 130 | assert(buf->list.length); | 130 | assert(buf->list.length); |
src/codegen.cpp+1-14| ... | @@ -5194,8 +5194,7 @@ void codegen_add_object(CodeGen *g, Buf *object_path) { | ... | @@ -5194,8 +5194,7 @@ void codegen_add_object(CodeGen *g, Buf *object_path) { |
| 5194 | g->link_objects.append(object_path); | 5194 | g->link_objects.append(object_path); |
| 5195 | } | 5195 | } |
| 5196 | 5196 | ||
| 5197 | #if defined(_MSVC) | 5197 | // Must be coordinated with with CIntType enum |
| 5198 | // MSVC doesn't seem to support "designators" for array initialization | ||
| 5199 | static const char *c_int_type_names[] = { | 5198 | static const char *c_int_type_names[] = { |
| 5200 | "short", | 5199 | "short", |
| 5201 | "unsigned short", | 5200 | "unsigned short", |
| ... | @@ -5206,18 +5205,6 @@ static const char *c_int_type_names[] = { | ... | @@ -5206,18 +5205,6 @@ static const char *c_int_type_names[] = { |
| 5206 | "long long", | 5205 | "long long", |
| 5207 | "unsigned long long", | 5206 | "unsigned long long", |
| 5208 | }; | 5207 | }; |
| 5209 | #else | ||
| 5210 | static const char *c_int_type_names[] = { | ||
| 5211 | [CIntTypeShort] = "short", | ||
| 5212 | [CIntTypeUShort] = "unsigned short", | ||
| 5213 | [CIntTypeInt] = "int", | ||
| 5214 | [CIntTypeUInt] = "unsigned int", | ||
| 5215 | [CIntTypeLong] = "long", | ||
| 5216 | [CIntTypeULong] = "unsigned long", | ||
| 5217 | [CIntTypeLongLong] = "long long", | ||
| 5218 | [CIntTypeULongLong] = "unsigned long long", | ||
| 5219 | }; | ||
| 5220 | #endif | ||
| 5221 | 5208 | ||
| 5222 | static void get_c_type(CodeGen *g, TypeTableEntry *type_entry, Buf *out_buf) { | 5209 | static void get_c_type(CodeGen *g, TypeTableEntry *type_entry, Buf *out_buf) { |
| 5223 | assert(type_entry); | 5210 | assert(type_entry); |
src/parsec.cpp+1-1| ... | @@ -56,7 +56,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl); | ... | @@ -56,7 +56,7 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl); |
| 56 | static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl); | 56 | static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl); |
| 57 | 57 | ||
| 58 | 58 | ||
| 59 | ATTRIBUTE_FORMAT(printf, 3, 4) | 59 | ATTRIBUTE_PRINTF(3, 4) |
| 60 | static void emit_warning(Context *c, const SourceLocation &sl, const char *format, ...) { | 60 | static void emit_warning(Context *c, const SourceLocation &sl, const char *format, ...) { |
| 61 | if (!c->warnings_on) { | 61 | if (!c->warnings_on) { |
| 62 | return; | 62 | return; |
src/parser.cpp+5-5| ... | @@ -24,8 +24,8 @@ struct ParseContext { | ... | @@ -24,8 +24,8 @@ struct ParseContext { |
| 24 | Buf *void_buf; | 24 | Buf *void_buf; |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| 27 | ATTRIBUTE_FORMAT(printf, 4, 5) | 27 | ATTRIBUTE_PRINTF(4, 5) |
| 28 | LLVM_ATTRIBUTE_NORETURN | 28 | ATTRIBUTE_NORETURN |
| 29 | static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const char *format, ...) { | 29 | static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const char *format, ...) { |
| 30 | assert(node->type == NodeTypeAsmExpr); | 30 | assert(node->type == NodeTypeAsmExpr); |
| 31 | 31 | ||
| ... | @@ -46,8 +46,8 @@ static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const | ... | @@ -46,8 +46,8 @@ static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const |
| 46 | exit(EXIT_FAILURE); | 46 | exit(EXIT_FAILURE); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | ATTRIBUTE_FORMAT(printf, 3, 4) | 49 | ATTRIBUTE_PRINTF(3, 4) |
| 50 | LLVM_ATTRIBUTE_NORETURN | 50 | ATTRIBUTE_NORETURN |
| 51 | static void ast_error(ParseContext *pc, Token *token, const char *format, ...) { | 51 | static void ast_error(ParseContext *pc, Token *token, const char *format, ...) { |
| 52 | va_list ap; | 52 | va_list ap; |
| 53 | va_start(ap, format); | 53 | va_start(ap, format); |
| ... | @@ -205,7 +205,7 @@ static void ast_buf_from_token(ParseContext *pc, Token *token, Buf *buf) { | ... | @@ -205,7 +205,7 @@ static void ast_buf_from_token(ParseContext *pc, Token *token, Buf *buf) { |
| 205 | } | 205 | } |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | LLVM_ATTRIBUTE_NORETURN | 208 | ATTRIBUTE_NORETURN |
| 209 | static void ast_invalid_token_error(ParseContext *pc, Token *token) { | 209 | static void ast_invalid_token_error(ParseContext *pc, Token *token) { |
| 210 | Buf token_value = BUF_INIT; | 210 | Buf token_value = BUF_INIT; |
| 211 | ast_buf_from_token(pc, token, &token_value); | 211 | ast_buf_from_token(pc, token, &token_value); |
src/parser.hpp+1-1| ... | @@ -12,7 +12,7 @@ | ... | @@ -12,7 +12,7 @@ |
| 12 | #include "tokenizer.hpp" | 12 | #include "tokenizer.hpp" |
| 13 | #include "errmsg.hpp" | 13 | #include "errmsg.hpp" |
| 14 | 14 | ||
| 15 | ATTRIBUTE_FORMAT(printf, 2, 3) | 15 | ATTRIBUTE_PRINTF(2, 3) |
| 16 | void ast_token_error(Token *token, const char *format, ...); | 16 | void ast_token_error(Token *token, const char *format, ...); |
| 17 | 17 | ||
| 18 | 18 |
src/quadmath.hpp+31-33| ... | @@ -8,46 +8,44 @@ | ... | @@ -8,46 +8,44 @@ |
| 8 | #ifndef ZIG_QUADMATH_HPP | 8 | #ifndef ZIG_QUADMATH_HPP |
| 9 | #define ZIG_QUADMATH_HPP | 9 | #define ZIG_QUADMATH_HPP |
| 10 | 10 | ||
| 11 | #if defined(_MSVC) | 11 | #if defined(_MSC_VER) |
| 12 | #include <stdlib.h> | 12 | #include <stdlib.h> |
| 13 | #include <stdio.h> | 13 | #include <stdio.h> |
| 14 | #include <stdarg.h> | 14 | #include <stdarg.h> |
| 15 | #include <cmath> | 15 | #include <cmath> |
| 16 | #endif | 16 | |
| 17 | static inline __float128 fmodq(__float128 a, __float128 b) { | ||
| 18 | return fmodl(a, b); | ||
| 19 | } | ||
| 20 | |||
| 21 | static inline __float128 ceilq(__float128 a) { | ||
| 22 | return ceill(a); | ||
| 23 | } | ||
| 24 | |||
| 25 | static inline __float128 floorq(__float128 a) { | ||
| 26 | return floorl(a); | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline __float128 strtoflt128(const char *s, char **sp) { | ||
| 30 | return strtold(s, sp); | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline int quadmath_snprintf(char *s, size_t size, const char *format, ...) { | ||
| 34 | va_list args; | ||
| 35 | va_start(format, args); | ||
| 36 | int result = vsnprintf(s, size, format, args); | ||
| 37 | va_end(args); | ||
| 38 | return result; | ||
| 39 | } | ||
| 17 | 40 | ||
| 18 | extern "C" { | ||
| 19 | #if defined(_MSVC) | ||
| 20 | static __float128 fmodq(__float128 a, __float128 b) | ||
| 21 | { | ||
| 22 | return fmod(a, b); | ||
| 23 | } | ||
| 24 | static __float128 ceilq(__float128 a) | ||
| 25 | { | ||
| 26 | return ceil(a); | ||
| 27 | } | ||
| 28 | static __float128 floorq(__float128 a) | ||
| 29 | { | ||
| 30 | return floor(a); | ||
| 31 | } | ||
| 32 | static __float128 strtoflt128(const char *s, char **sp) | ||
| 33 | { | ||
| 34 | return strtold(s, sp); | ||
| 35 | } | ||
| 36 | static int quadmath_snprintf(char *s, size_t size, const char *format, ...) | ||
| 37 | { | ||
| 38 | va_list args; | ||
| 39 | va_start(format, args); | ||
| 40 | int result = vsnprintf(s, size, format, args); | ||
| 41 | va_end(args); | ||
| 42 | return result; | ||
| 43 | } | ||
| 44 | #else | 41 | #else |
| 42 | extern "C" { | ||
| 45 | __float128 fmodq(__float128 a, __float128 b); | 43 | __float128 fmodq(__float128 a, __float128 b); |
| 46 | __float128 ceilq(__float128 a); | 44 | __float128 ceilq(__float128 a); |
| 47 | __float128 floorq(__float128 a); | 45 | __float128 floorq(__float128 a); |
| 48 | __float128 strtoflt128 (const char *s, char **sp); | 46 | __float128 strtoflt128 (const char *s, char **sp); |
| 49 | int quadmath_snprintf (char *s, size_t size, const char *format, ...); | 47 | int quadmath_snprintf (char *s, size_t size, const char *format, ...); |
| 50 | #endif | ||
| 51 | } | 48 | } |
| 49 | #endif | ||
| 52 | 50 | ||
| 53 | #endif | 51 | #endif |
src/tokenizer.cpp+1-1| ... | @@ -234,7 +234,7 @@ struct Tokenize { | ... | @@ -234,7 +234,7 @@ struct Tokenize { |
| 234 | BigInt significand; | 234 | BigInt significand; |
| 235 | }; | 235 | }; |
| 236 | 236 | ||
| 237 | ATTRIBUTE_FORMAT(printf, 2, 3) | 237 | ATTRIBUTE_PRINTF(2, 3) |
| 238 | static void tokenize_error(Tokenize *t, const char *format, ...) { | 238 | static void tokenize_error(Tokenize *t, const char *format, ...) { |
| 239 | t->state = TokenizeStateError; | 239 | t->state = TokenizeStateError; |
| 240 | 240 |
src/util.hpp+35-30| ... | @@ -12,52 +12,57 @@ | ... | @@ -12,52 +12,57 @@ |
| 12 | #include <stdint.h> | 12 | #include <stdint.h> |
| 13 | #include <string.h> | 13 | #include <string.h> |
| 14 | #include <assert.h> | 14 | #include <assert.h> |
| 15 | #include <llvm/Support/Compiler.h> | ||
| 16 | 15 | ||
| 17 | #include <new> | 16 | #include <new> |
| 18 | 17 | ||
| 19 | #if defined(_MSVC) | 18 | #if defined(_MSC_VER) |
| 20 | #define ATTRIBUTE_COLD | 19 | |
| 21 | #define ATTRIBUTE_FORMAT(args) | 20 | #include <intrin.h> |
| 22 | static inline uint32_t popcnt(unsigned long long x) | 21 | |
| 23 | { | 22 | #define ATTRIBUTE_COLD __declspec(noinline) |
| 24 | x -= ((x >> 1) & 0x55555555); | 23 | #define ATTRIBUTE_PRINTF(a, b) |
| 25 | x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); | 24 | #define ATTRIBUTE_RETURNS_NOALIAS __declspec(restrict) |
| 26 | x = (((x >> 4) + x) & 0x0f0f0f0f); | 25 | #define ATTRIBUTE_NORETURN __declspec(noreturn) |
| 27 | x += (x >> 8); | 26 | |
| 28 | x += (x >> 16); | 27 | static inline int clzll(unsigned long long mask) { |
| 29 | return x & 0x0000003f; | 28 | unsigned long lz; |
| 30 | } | 29 | #if defined(_WIN64) |
| 31 | static inline uint32_t clzll(unsigned long long x) | 30 | if (_BitScanReverse64(&lz, mask)) |
| 32 | { | 31 | return static_cast<int>(63-lz); |
| 33 | x |= (x >> 1); | 32 | zig_unreachable(); |
| 34 | x |= (x >> 2); | ||
| 35 | x |= (x >> 4); | ||
| 36 | x |= (x >> 8); | ||
| 37 | x |= (x >> 16); | ||
| 38 | return 32 - popcnt(x); | ||
| 39 | } | ||
| 40 | #else | 33 | #else |
| 41 | #define ATTRIBUTE_COLD __attribute__((cold)) | 34 | if (_BitScanReverse(&lz, mask >> 32)) |
| 42 | #define ATTRIBUTE_FORMAT(args) __attribute__((format (args))) | 35 | lz += 32; |
| 43 | #define clzll(x) __builtin_clzll(x) | 36 | else |
| 37 | _BitScanReverse(&lz, mask & 0xffffffff); | ||
| 38 | return 63 - lz; | ||
| 39 | #endif | ||
| 40 | } | ||
| 41 | #else | ||
| 42 | |||
| 43 | #define ATTRIBUTE_COLD __attribute__((cold)) | ||
| 44 | #define ATTRIBUTE_PRINTF(a, b) __attribute__((format(printf, a, b))) | ||
| 45 | #define ATTRIBUTE_RETURNS_NOALIAS __attribute__((__malloc__)) | ||
| 46 | #define ATTRIBUTE_NORETURN __attribute__((noreturn)) | ||
| 47 | #define clzll(x) __builtin_clzll(x) | ||
| 48 | |||
| 44 | #endif | 49 | #endif |
| 45 | 50 | ||
| 46 | #define BREAKPOINT __asm("int $0x03") | 51 | #define BREAKPOINT __asm("int $0x03") |
| 47 | 52 | ||
| 48 | LLVM_ATTRIBUTE_NOINLINE | ||
| 49 | ATTRIBUTE_COLD | 53 | ATTRIBUTE_COLD |
| 50 | ATTRIBUTE_FORMAT(printf, 1, 2) | 54 | ATTRIBUTE_NORETURN |
| 55 | ATTRIBUTE_PRINTF(1, 2) | ||
| 51 | void zig_panic(const char *format, ...); | 56 | void zig_panic(const char *format, ...); |
| 52 | 57 | ||
| 53 | ATTRIBUTE_COLD | 58 | ATTRIBUTE_COLD |
| 54 | LLVM_ATTRIBUTE_NOINLINE | 59 | ATTRIBUTE_NORETURN |
| 55 | static inline void zig_unreachable(void) { | 60 | static inline void zig_unreachable(void) { |
| 56 | zig_panic("unreachable"); | 61 | zig_panic("unreachable"); |
| 57 | } | 62 | } |
| 58 | 63 | ||
| 59 | template<typename T> | 64 | template<typename T> |
| 60 | LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) { | 65 | ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) { |
| 61 | T *ptr = reinterpret_cast<T*>(malloc(count * sizeof(T))); | 66 | T *ptr = reinterpret_cast<T*>(malloc(count * sizeof(T))); |
| 62 | if (!ptr) | 67 | if (!ptr) |
| 63 | zig_panic("allocation failed"); | 68 | zig_panic("allocation failed"); |
| ... | @@ -65,7 +70,7 @@ LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) { | ... | @@ -65,7 +70,7 @@ LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) { |
| 65 | } | 70 | } |
| 66 | 71 | ||
| 67 | template<typename T> | 72 | template<typename T> |
| 68 | LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate(size_t count) { | 73 | ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate(size_t count) { |
| 69 | T *ptr = reinterpret_cast<T*>(calloc(count, sizeof(T))); | 74 | T *ptr = reinterpret_cast<T*>(calloc(count, sizeof(T))); |
| 70 | if (!ptr) | 75 | if (!ptr) |
| 71 | zig_panic("allocation failed"); | 76 | zig_panic("allocation failed"); |