static void set_method_external_nominal(reach_type_t* t, const char* name) { reach_method_name_t* n = reach_method_name(t, name); if(n != NULL) { size_t i = HASHMAP_BEGIN; reach_method_t* m; while((m = reach_methods_next(&n->r_methods, &i)) != NULL) { LLVMSetFunctionCallConv(m->func, LLVMCCallConv); LLVMSetLinkage(m->func, LLVMExternalLinkage); } } }
void genprim_donotoptimise_methods(compile_t* c, reach_type_t* t) { size_t i = HASHMAP_BEGIN; reach_method_name_t* mn; const char* str_apply = stringtab("apply"); while((mn = reach_method_names_next(&t->methods, &i)) != NULL) { if(mn->name == str_apply) { size_t j = HASHMAP_BEGIN; reach_method_t* m; while((m = reach_methods_next(&mn->r_methods, &j)) != NULL) donotoptimise_apply(c, t, m); break; } } donotoptimise_observe(c, t); }
static void set_method_external_interface(reach_type_t* t, const char* name) { set_method_external_nominal(t, name); size_t i = HASHMAP_BEGIN; reach_type_t* sub; while((sub = reach_type_cache_next(&t->subtypes, &i)) != NULL) { reach_method_name_t* n = reach_method_name(sub, name); if(n == NULL) continue; size_t j = HASHMAP_BEGIN; reach_method_t* m; while((m = reach_methods_next(&n->r_methods, &j)) != NULL) { LLVMSetFunctionCallConv(m->func, LLVMCCallConv); LLVMSetLinkage(m->func, LLVMExternalLinkage); } } }