aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-05-01 22:12:37 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-05-02 00:59:52 +0200
commit25f1d0906d2b5a8276c3832783970a798c12cc6c (patch)
tree5b25b9c5ee9b7a68354c37fd2c24f54f2ed1905b /src/types.cpp
parentff0973e0f55e5c1d3aad4b80dc73e740fde4105c (diff)
compiler: improve target features support
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/types.cpp b/src/types.cpp
index 18cb12ea1..3ec05059f 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -184,6 +184,8 @@ struct TypeProc {
isize specialization_count;
ProcCallingConvention calling_convention;
i32 variadic_index;
+ String require_target_feature;
+ String enable_target_feature;
// TODO(bill): Make this a flag set rather than bools
bool variadic;
bool require_results;
@@ -2991,7 +2993,22 @@ gb_internal Type *union_tag_type(Type *u) {
return t_uint;
}
+gb_internal int matched_target_features(TypeProc *t) {
+ if (t->require_target_feature.len == 0) {
+ return 0;
+ }
+ int matches = 0;
+ String_Iterator it = {t->require_target_feature, 0};
+ for (;;) {
+ String str = string_split_iterator(&it, ',');
+ if (str == "") break;
+ if (check_target_feature_is_valid_for_target_arch(str, nullptr)) {
+ matches += 1;
+ }
+ }
+ return matches;
+}
enum ProcTypeOverloadKind {
ProcOverload_Identical, // The types are identical
@@ -3003,6 +3020,7 @@ enum ProcTypeOverloadKind {
ProcOverload_ResultCount,
ProcOverload_ResultTypes,
ProcOverload_Polymorphic,
+ ProcOverload_TargetFeatures,
ProcOverload_NotProcedure,
@@ -3060,6 +3078,10 @@ gb_internal ProcTypeOverloadKind are_proc_types_overload_safe(Type *x, Type *y)
}
}
+ if (matched_target_features(&px) != matched_target_features(&py)) {
+ return ProcOverload_TargetFeatures;
+ }
+
if (px.params != nullptr && py.params != nullptr) {
Entity *ex = px.params->Tuple.variables[0];
Entity *ey = py.params->Tuple.variables[0];