1 /*
2  * Copyright (c) 2019 Andrew Kelley
3  *
4  * This file is part of zig, which is MIT licensed.
5  * See http://opensource.org/licenses/MIT
6  */
7 
8 // This file deals with exposing stage2 Zig code to stage1 C++ code.
9 
10 #ifndef ZIG_STAGE2_H
11 #define ZIG_STAGE2_H
12 
13 #include <stddef.h>
14 #include <stdint.h>
15 #include <stdio.h>
16 
17 #include "stage1.h"
18 
19 #ifdef __cplusplus
20 #define ZIG_EXTERN_C extern "C"
21 #else
22 #define ZIG_EXTERN_C
23 #endif
24 
25 #if defined(_MSC_VER)
26 #define ZIG_ATTRIBUTE_NORETURN __declspec(noreturn)
27 #else
28 #define ZIG_ATTRIBUTE_NORETURN __attribute__((noreturn))
29 #endif
30 
31 // ABI warning: the types and declarations in this file must match both those in
32 // stage2.cpp and src/stage1.zig.
33 
34 // ABI warning
35 enum Error {
36     ErrorNone,
37     ErrorNoMem,
38     ErrorInvalidFormat,
39     ErrorSemanticAnalyzeFail,
40     ErrorAccess,
41     ErrorInterrupted,
42     ErrorSystemResources,
43     ErrorFileNotFound,
44     ErrorFileSystem,
45     ErrorFileTooBig,
46     ErrorDivByZero,
47     ErrorOverflow,
48     ErrorPathAlreadyExists,
49     ErrorUnexpected,
50     ErrorExactDivRemainder,
51     ErrorNegativeDenominator,
52     ErrorShiftedOutOneBits,
53     ErrorCCompileErrors,
54     ErrorEndOfFile,
55     ErrorIsDir,
56     ErrorNotDir,
57     ErrorUnsupportedOperatingSystem,
58     ErrorSharingViolation,
59     ErrorPipeBusy,
60     ErrorPrimitiveTypeNotFound,
61     ErrorCacheUnavailable,
62     ErrorPathTooLong,
63     ErrorCCompilerCannotFindFile,
64     ErrorNoCCompilerInstalled,
65     ErrorReadingDepFile,
66     ErrorInvalidDepFile,
67     ErrorMissingArchitecture,
68     ErrorMissingOperatingSystem,
69     ErrorUnknownArchitecture,
70     ErrorUnknownOperatingSystem,
71     ErrorUnknownABI,
72     ErrorInvalidFilename,
73     ErrorDiskQuota,
74     ErrorDiskSpace,
75     ErrorUnexpectedWriteFailure,
76     ErrorUnexpectedSeekFailure,
77     ErrorUnexpectedFileTruncationFailure,
78     ErrorUnimplemented,
79     ErrorOperationAborted,
80     ErrorBrokenPipe,
81     ErrorNoSpaceLeft,
82     ErrorNotLazy,
83     ErrorIsAsync,
84     ErrorImportOutsidePkgPath,
85     ErrorUnknownCpu,
86     ErrorUnknownCpuFeature,
87     ErrorInvalidCpuFeatures,
88     ErrorInvalidLlvmCpuFeaturesFormat,
89     ErrorUnknownApplicationBinaryInterface,
90     ErrorASTUnitFailure,
91     ErrorBadPathName,
92     ErrorSymLinkLoop,
93     ErrorProcessFdQuotaExceeded,
94     ErrorSystemFdQuotaExceeded,
95     ErrorNoDevice,
96     ErrorDeviceBusy,
97     ErrorUnableToSpawnCCompiler,
98     ErrorCCompilerExitCode,
99     ErrorCCompilerCrashed,
100     ErrorCCompilerCannotFindHeaders,
101     ErrorLibCRuntimeNotFound,
102     ErrorLibCStdLibHeaderNotFound,
103     ErrorLibCKernel32LibNotFound,
104     ErrorUnsupportedArchitecture,
105     ErrorWindowsSdkNotFound,
106     ErrorUnknownDynamicLinkerPath,
107     ErrorTargetHasNoDynamicLinker,
108     ErrorInvalidAbiVersion,
109     ErrorInvalidOperatingSystemVersion,
110     ErrorUnknownClangOption,
111     ErrorNestedResponseFile,
112     ErrorZigIsTheCCompiler,
113     ErrorFileBusy,
114     ErrorLocked,
115     ErrorInvalidCharacter,
116     ErrorUnicodePointTooLarge,
117 };
118 
119 // ABI warning
120 struct Stage2ErrorMsg {
121     const char *filename_ptr; // can be null
122     size_t filename_len;
123     const char *msg_ptr;
124     size_t msg_len;
125     const char *source; // valid until the ASTUnit is freed. can be null
126     unsigned line; // 0 based
127     unsigned column; // 0 based
128     unsigned offset; // byte offset into source
129 };
130 
131 // ABI warning
132 ZIG_EXTERN_C ZIG_ATTRIBUTE_NORETURN void stage2_panic(const char *ptr, size_t len);
133 
134 // ABI warning
135 ZIG_EXTERN_C struct Stage2Progress *stage2_progress_create(void);
136 // ABI warning
137 ZIG_EXTERN_C void stage2_progress_disable_tty(struct Stage2Progress *progress);
138 // ABI warning
139 ZIG_EXTERN_C void stage2_progress_destroy(struct Stage2Progress *progress);
140 // ABI warning
141 ZIG_EXTERN_C struct Stage2ProgressNode *stage2_progress_start_root(struct Stage2Progress *progress,
142         const char *name_ptr, size_t name_len, size_t estimated_total_items);
143 // ABI warning
144 ZIG_EXTERN_C struct Stage2ProgressNode *stage2_progress_start(struct Stage2ProgressNode *node,
145         const char *name_ptr, size_t name_len, size_t estimated_total_items);
146 // ABI warning
147 ZIG_EXTERN_C void stage2_progress_end(struct Stage2ProgressNode *node);
148 // ABI warning
149 ZIG_EXTERN_C void stage2_progress_complete_one(struct Stage2ProgressNode *node);
150 // ABI warning
151 ZIG_EXTERN_C void stage2_progress_update_node(struct Stage2ProgressNode *node,
152         size_t completed_count, size_t estimated_total_items);
153 
154 // ABI warning
155 struct Stage2SemVer {
156     uint32_t major;
157     uint32_t minor;
158     uint32_t patch;
159 };
160 
161 // ABI warning
162 ZIG_EXTERN_C const char *stage2_version_string(void);
163 
164 // ABI warning
165 ZIG_EXTERN_C Stage2SemVer stage2_version(void);
166 
167 // ABI warning
168 ZIG_EXTERN_C enum Error stage2_target_parse(struct ZigTarget *target, const char *zig_triple, const char *mcpu,
169         const char *dynamic_linker);
170 
171 // ABI warning
172 ZIG_EXTERN_C const char *stage2_fetch_file(struct ZigStage1 *stage1, const char *path_ptr, size_t path_len,
173         size_t *result_len);
174 
175 // ABI warning
176 ZIG_EXTERN_C Error stage2_cimport(struct ZigStage1 *stage1, const char *c_src_ptr, size_t c_src_len,
177         const char **out_zig_path_ptr, size_t *out_zig_path_len,
178         struct Stage2ErrorMsg **out_errors_ptr, size_t *out_errors_len);
179 
180 // ABI warning
181 ZIG_EXTERN_C const char *stage2_add_link_lib(struct ZigStage1 *stage1,
182         const char *lib_name_ptr, size_t lib_name_len,
183         const char *symbol_name_ptr, size_t symbol_name_len);
184 
185 #endif
186