34 const unsigned c_unsaved_count,
42 const CXIndex CXIDX = clang_createIndex(0, 0);
46 enum CXErrorCode CXERR = CXError_Success;
49 unsigned CXTU_IDX_ERR;
50#define STATE_VAL CTX.m_err
55 memset(&CTX, 0,
sizeof(CTX));
56 init_scale(&CTX.m_scale_vars, 0);
59 CTX.m_err = ACLSPV_COMPILE_MET_INVAL;
63 CXERR = clang_parseTranslationUnit2(
65 , (
const char**)rd_argv_opt
67 , rdwr_unsaved, c_unsaved_count
68 , CXTranslationUnit_None, &CXTU
71 CXTU_IDX_ERR = clang_getNumDiagnostics(CXTU);
73 const CXDiagnostic DIAG = clang_getDiagnostic(CXTU, CXTU_IDX_ERR);
74 enum CXDiagnosticSeverity SEVERITY = clang_getDiagnosticSeverity(DIAG);
76 CXString TXT = clang_formatDiagnostic(DIAG, clang_defaultDiagnosticDisplayOptions());
81 case CXDiagnostic_Note:
84 case CXDiagnostic_Error:
87 case CXDiagnostic_Warning:
90 case CXDiagnostic_Ignored:
93 case CXDiagnostic_Fatal:
101 clang_disposeString(TXT);
105 CTX.m_err = ACLSPV_COMPILE_ERR_CLANG;
110 CTX.m_err = ACLSPV_COMPILE_MET_INVAL;
117 CXROOTCUR = clang_getTranslationUnitCursor(CXTU);
119 clang_visitChildren(CXROOTCUR, emit_count_fn, &CTX);
123 _aclspv_grow_vec(_aclspv_malloc, _aclspv_free, CTX.m_fnlist.m_entp, (size_t)(
sizeof(util_entp_t) * CTX.m_fnlist.m_num_entp));
124 _aclspv_grow_vec(_aclspv_malloc, _aclspv_free, CTX.m_fnlist.m_fn, (size_t)(
sizeof(lib_build_fn_t) * CTX.m_fnlist.m_num_fn));
126 CTX.m_tmp.m_w3 = CTX
.m_id;
127 CTX
.m_id += CTX.m_fnlist.m_num_entp + CTX.m_fnlist.m_num_fn;
129 clang_visitChildren(CXROOTCUR, emit_iter_entry_point, &CTX);
132 clang_visitChildren(CXROOTCUR, emit_decl_glob_obj, &CTX);
138 util_get_default_id(ID_DEFAULT_VOID, &CTX);
139 util_get_default_id(ID_DEFAULT_FN_VOID, &CTX);
143 ((util_entp_t*
ae2f_restrict)CTX.m_fnlist.m_entp.m_p)[IDX].m_id = ANCHOR + IDX;
146 IDX = CTX.m_fnlist.m_num_entp;
149
150
151
152
153#define FNINFO ((util_entp_t* ae2f_restrict)CTX.m_fnlist.m_entp.m_p)[CTX.m_tmp.m_w0]
154 x_scale*
ae2f_restrict const FNSCALE = get_scale_from_vec(&CTX.m_scale_vars
155 , (size_t)(CTX.m_tmp.m_w0 = IDX)
158 CTX.m_count.m_fnimpl = 0;
161 CTX.m_err = ACLSPV_COMPILE_MET_INVAL;
166 CTX.m_err = ACLSPV_COMPILE_ALLOC_FAILED;
167 CTX.m_tmp.m_w0 = IDX;
171 &CTX.m_section.m_fndef
172 , CTX.m_count.m_fndef
181 &CTX.m_section.m_fndef
182 , CTX.m_count.m_fndef
187 IDX = (
aclspv_wrd_t)FNSCALE->m_sz / (size_t)
sizeof(util_bind);
198 assert(CTX.m_scale_vars.m_p);
208 .m_data.m_prm_decl.m_info = BUFFER[IDX];
210 IDX = CTX.m_tmp.m_w0;
215 CTX.m_has_function_ret = 0;
216 clang_visitChildren(((util_entp_t*
ae2f_restrict)CTX.m_fnlist.m_entp.m_p)[IDX].m_fn
221 if(CTX.m_count.m_fnimpl) {
222 _aclspv_grow_vec_with_copy(_aclspv_malloc, _aclspv_free, _aclspv_memcpy, L_new
223 , CTX.m_section.m_fndef
224 , (size_t)
count_to_sz(CTX.m_count.m_fndef + CTX.m_count.m_fnimpl)
228 CTX.m_err = ACLSPV_COMPILE_ALLOC_FAILED;
234 , CTX.m_section.m_fnimpl.m_p
238 CTX.m_count.m_fndef += CTX.m_count.m_fnimpl;
241 unless(CTX.m_has_function_ret) {
243 &CTX.m_section.m_fndef
244 , CTX.m_count.m_fndef
247 CTX.m_err = ACLSPV_COMPILE_ALLOC_FAILED;
253 &CTX.m_section.m_fndef
254 , CTX.m_count.m_fndef
255 , SpvOpFunctionEnd, 0
257 CTX.m_err = ACLSPV_COMPILE_ALLOC_FAILED;
261 assert(IDX == CTX.m_tmp.m_w0);
275 clang_disposeTranslationUnit(CXTU);
276 _aclspv_stop_vec(_aclspv_free, CTX.m_constant_cache);
277 _aclspv_stop_vec(_aclspv_free, CTX.m_type_uniques);
278 _aclspv_stop_vec(_aclspv_free, CTX.m_cursors);
279 _aclspv_stop_vec(_aclspv_free, CTX.m_scale_vars);
281 _aclspv_stop_vec(_aclspv_free, CTX.m_fnlist.m_entp);
282 _aclspv_stop_vec(_aclspv_free, CTX.m_fnlist.m_fn);
284 _aclspv_stop_vec(_aclspv_free, CTX.m_tmp.m_v0);
285 _aclspv_stop_vec(_aclspv_free, CTX.m_tmp.m_v1);
287 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_capability);
288 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_decorate);
289 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_entp);
290 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_fndef);
291 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_execmode);
292 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_ext);
293 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_memmodel);
294 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_name);
295 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_types);
296 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_vars);
297 _aclspv_stop_vec(_aclspv_free, CTX.m_section.m_fnimpl);
302 if((rwr_output)) *rwr_output = CTX.m_ret.m_p;
303 else free(CTX.m_ret.m_p);
305 if(
ae2f_expected(rwr_output_count_opt)) *rwr_output_count_opt = CTX.m_num_ret;