authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-13 00:17:19-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-13 02:40:02-04:00
log57ea6e8c9f204be6d38177024d3b8f1aba4e05b2
tree0a9897aab096767288688216aa68d3809e2d77fe
parent67021e2bfff0b9caea432fd996031ab880afdbc5

fix up msvc stuff to make it work on linux and macos too


15 files changed, 299 insertions(+), 222 deletions(-)

.gitignore+1-7
...@@ -1,9 +1,3 @@...@@ -1,9 +1,3 @@
1zig-cache/1zig-cache/
2build/2build/
3build-release/3build-*/
4build-windows/
5build-llvm4-debug/
6build-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/lld26# git log -p -- deps/lld
27option(ZIG_FORCE_EXTERNAL_LLD "If your system has the LLD patches use it instead of the embedded LLD" OFF)27option(ZIG_FORCE_EXTERNAL_LLD "If your system has the LLD patches use it instead of the embedded LLD" OFF)
2828
29find_package(LLVM REQUIRED CONFIG)29find_package(llvm)
30include_directories(${LLVM_INCLUDE_DIRS})30include_directories(${LLVM_INCLUDE_DIRS})
3131
32# TODO: this currently doesn't work, it currently defines UNICODE but zig32find_package(clang)
33# uses MBCS
34#add_definitions(${LLVM_DEFINITIONS})
35
36link_directories(${LLVM_LIBRARY_DIRS})
37llvm_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
93find_package(CLANG REQUIRED CONFIG)
94include_directories(${CLANG_INCLUDE_DIRS})33include_directories(${CLANG_INCLUDE_DIRS})
95set(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
10934
110if(ZIG_FORCE_EXTERNAL_LLD)35if(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 PROPERTIES136 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 PROPERTIES140 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 PROPERTIES144 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 PUBLIC148 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)
291216
292set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")217if(MSVC)
293if(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")219elseif(MINGW)
220 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Werror -Wno-error=format= -Wno-error=format -Wno-error=format-extra-args")
221else()
222 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Werror -Wall")
295endif()223endif()
296224
297set(EXE_CFLAGS "-std=c++11")225if(MSVC)
298if(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")227else()
300elseif(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")
302endif()229endif()
230
303set(EXE_LDFLAGS " ")231set(EXE_LDFLAGS " ")
304if(ZIG_TEST_COVERAGE)232if(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)
314242
315if(MINGW)
316 set(PLATFORM_LIBRARIES quadmath)
317endif()
318target_link_libraries(zig LINK_PUBLIC243target_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)
325if(MINGW OR MSVC)
326 target_link_libraries(zig LINK_PUBLIC version)
327endif()
328if(MSVC)250if(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)
252elseif(MINGW)
253 target_link_libraries(zig LINK_PUBLIC version quadmath)
254else()
255 target_link_libraries(zig LINK_PUBLIC quadmath)
330endif()256endif()
331install(TARGETS zig DESTINATION bin)257install(TARGETS zig DESTINATION bin)
332258
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
9if(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
26else()
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)
58endif()
59
60include(FindPackageHandleStandardArgs)
61find_package_handle_standard_args(CLANG DEFAULT_MSG CLANG_LIBRARIES CLANG_INCLUDE_DIRS)
62
63mark_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
10if(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
74else()
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()
110endif()
111
112
113include(FindPackageHandleStandardArgs)
114find_package_handle_standard_args(LLVM DEFAULT_MSG LLVM_LIBRARIES LLVM_INCLUDE_DIRS)
115
116mark_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>
1515
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 */
21typedef long double __float128;18typedef long double __float128;
22#endif19#endif
2320
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}
379379
380#if defined(_MSVC)380#if defined(_MSC_VER)
381/*
382 * Inneficient implmentations for now
383 */
384static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {381static 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}
391385
392static bool sub_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {386static 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}
400390
401bool mul_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {391bool 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; // overflow395 return false;
406 }396
407 } else {397 if (op1 > UINT64_MAX / op2)
408 if(*result / op2 != op1) {398 return true;
409 return true; // overflow399
410 }400 if (op2 > UINT64_MAX / op1)
411 }401 return true;
412 return false; // no overflow402
403 return false;
413}404}
414#else405#else
415static bool add_u64_overflow(uint64_t op1, uint64_t op2, uint64_t *result) {406static 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>
1313
14#if defined(_MSVC)14#if defined(_MSC_VER)
15 // TEMPORARY WORKAROUND FOR MSVC NOT SUPPORTING __int12815 // 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};
2525
26Buf *buf_sprintf(const char *format, ...)26Buf *buf_sprintf(const char *format, ...)
27 ATTRIBUTE_FORMAT(printf, 1, 2);27 ATTRIBUTE_PRINTF(1, 2);
28Buf *buf_vprintf(const char *format, va_list ap);28Buf *buf_vprintf(const char *format, va_list ap);
2929
30static inline size_t buf_len(Buf *buf) {30static 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}
125125
126void buf_appendf(Buf *buf, const char *format, ...)126void buf_appendf(Buf *buf, const char *format, ...)
127 ATTRIBUTE_FORMAT(printf, 2, 3);127 ATTRIBUTE_PRINTF(2, 3);
128128
129static inline bool buf_eql_mem(Buf *buf, const char *mem, size_t mem_len) {129static 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}
51965196
5197#if defined(_MSVC)5197// Must be coordinated with with CIntType enum
5198// MSVC doesn't seem to support "designators" for array initialization
5199static const char *c_int_type_names[] = {5198static 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
5210static 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
52215208
5222static void get_c_type(CodeGen *g, TypeTableEntry *type_entry, Buf *out_buf) {5209static 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);
56static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl);56static AstNode *resolve_typedef_decl(Context *c, const TypedefNameDecl *typedef_decl);
5757
5858
59ATTRIBUTE_FORMAT(printf, 3, 4)59ATTRIBUTE_PRINTF(3, 4)
60static void emit_warning(Context *c, const SourceLocation &sl, const char *format, ...) {60static 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};
2626
27ATTRIBUTE_FORMAT(printf, 4, 5)27ATTRIBUTE_PRINTF(4, 5)
28LLVM_ATTRIBUTE_NORETURN28ATTRIBUTE_NORETURN
29static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const char *format, ...) {29static void ast_asm_error(ParseContext *pc, AstNode *node, size_t offset, const char *format, ...) {
30 assert(node->type == NodeTypeAsmExpr);30 assert(node->type == NodeTypeAsmExpr);
3131
...@@ -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}
4848
49ATTRIBUTE_FORMAT(printf, 3, 4)49ATTRIBUTE_PRINTF(3, 4)
50LLVM_ATTRIBUTE_NORETURN50ATTRIBUTE_NORETURN
51static void ast_error(ParseContext *pc, Token *token, const char *format, ...) {51static 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}
207207
208LLVM_ATTRIBUTE_NORETURN208ATTRIBUTE_NORETURN
209static void ast_invalid_token_error(ParseContext *pc, Token *token) {209static 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"
1414
15ATTRIBUTE_FORMAT(printf, 2, 3)15ATTRIBUTE_PRINTF(2, 3)
16void ast_token_error(Token *token, const char *format, ...);16void ast_token_error(Token *token, const char *format, ...);
1717
1818
src/quadmath.hpp+31-33
...@@ -8,46 +8,44 @@...@@ -8,46 +8,44 @@
8#ifndef ZIG_QUADMATH_HPP8#ifndef ZIG_QUADMATH_HPP
9#define ZIG_QUADMATH_HPP9#define ZIG_QUADMATH_HPP
1010
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#endif16
17static inline __float128 fmodq(__float128 a, __float128 b) {
18 return fmodl(a, b);
19}
20
21static inline __float128 ceilq(__float128 a) {
22 return ceill(a);
23}
24
25static inline __float128 floorq(__float128 a) {
26 return floorl(a);
27}
28
29static inline __float128 strtoflt128(const char *s, char **sp) {
30 return strtold(s, sp);
31}
32
33static 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}
1740
18extern "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#else41#else
42extern "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
5250
53#endif51#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};
236236
237ATTRIBUTE_FORMAT(printf, 2, 3)237ATTRIBUTE_PRINTF(2, 3)
238static void tokenize_error(Tokenize *t, const char *format, ...) {238static void tokenize_error(Tokenize *t, const char *format, ...) {
239 t->state = TokenizeStateError;239 t->state = TokenizeStateError;
240240
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>
1615
17#include <new>16#include <new>
1817
19#if defined(_MSVC)18#if defined(_MSC_VER)
20 #define ATTRIBUTE_COLD19
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); 27static 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#else33#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#endif49#endif
4550
46#define BREAKPOINT __asm("int $0x03")51#define BREAKPOINT __asm("int $0x03")
4752
48LLVM_ATTRIBUTE_NOINLINE
49ATTRIBUTE_COLD53ATTRIBUTE_COLD
50ATTRIBUTE_FORMAT(printf, 1, 2)54ATTRIBUTE_NORETURN
55ATTRIBUTE_PRINTF(1, 2)
51void zig_panic(const char *format, ...);56void zig_panic(const char *format, ...);
5257
53ATTRIBUTE_COLD58ATTRIBUTE_COLD
54LLVM_ATTRIBUTE_NOINLINE59ATTRIBUTE_NORETURN
55static inline void zig_unreachable(void) {60static inline void zig_unreachable(void) {
56 zig_panic("unreachable");61 zig_panic("unreachable");
57}62}
5863
59template<typename T>64template<typename T>
60LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate_nonzero(size_t count) {65ATTRIBUTE_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}
6671
67template<typename T>72template<typename T>
68LLVM_ATTRIBUTE_RETURNS_NOALIAS static inline T *allocate(size_t count) {73ATTRIBUTE_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");