diff options
| author | gingerBill <bill@gingerbill.org> | 2021-06-17 20:39:00 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-06-17 20:39:00 +0100 |
| commit | abe728dbbb51dc5e9c905e2cfa72f2c687c36588 (patch) | |
| tree | cb19012c75621b9c1de2192a1af4509953472d6f /src/types.cpp | |
| parent | 574ceb37a9f93f90906fe8389896c53bc71b94f6 (diff) | |
Add `intrinsics.type_is_endian_platform`
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/types.cpp b/src/types.cpp index f36765641..7f22d0202 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1351,8 +1351,7 @@ bool is_type_union_maybe_pointer_original_alignment(Type *t) { - -bool is_type_integer_endian_big(Type *t) { +bool is_type_endian_big(Type *t) { t = core_type(t); if (t->kind == Type_Basic) { if (t->Basic.flags & BasicFlag_EndianBig) { @@ -1362,15 +1361,13 @@ bool is_type_integer_endian_big(Type *t) { } return build_context.endian_kind == TargetEndian_Big; } else if (t->kind == Type_BitSet) { - return is_type_integer_endian_big(bit_set_to_int(t)); + return is_type_endian_big(bit_set_to_int(t)); } else if (t->kind == Type_Pointer) { - return is_type_integer_endian_big(&basic_types[Basic_uintptr]); + return is_type_endian_big(&basic_types[Basic_uintptr]); } return build_context.endian_kind == TargetEndian_Big; } - - -bool is_type_integer_endian_little(Type *t) { +bool is_type_endian_little(Type *t) { t = core_type(t); if (t->kind == Type_Basic) { if (t->Basic.flags & BasicFlag_EndianLittle) { @@ -1380,17 +1377,23 @@ bool is_type_integer_endian_little(Type *t) { } return build_context.endian_kind == TargetEndian_Little; } else if (t->kind == Type_BitSet) { - return is_type_integer_endian_little(bit_set_to_int(t)); + return is_type_endian_little(bit_set_to_int(t)); } else if (t->kind == Type_Pointer) { - return is_type_integer_endian_little(&basic_types[Basic_uintptr]); + return is_type_endian_little(&basic_types[Basic_uintptr]); } return build_context.endian_kind == TargetEndian_Little; } -bool is_type_endian_big(Type *t) { - return is_type_integer_endian_big(t); -} -bool is_type_endian_little(Type *t) { - return is_type_integer_endian_little(t); + +bool is_type_endian_platform(Type *t) { + t = core_type(t); + if (t->kind == Type_Basic) { + return (t->Basic.flags & (BasicFlag_EndianLittle|BasicFlag_EndianBig)) == 0; + } else if (t->kind == Type_BitSet) { + return is_type_endian_platform(bit_set_to_int(t)); + } else if (t->kind == Type_Pointer) { + return is_type_endian_platform(&basic_types[Basic_uintptr]); + } + return false; } bool types_have_same_internal_endian(Type *a, Type *b) { @@ -1446,9 +1449,9 @@ bool is_type_dereferenceable(Type *t) { bool is_type_different_to_arch_endianness(Type *t) { switch (build_context.endian_kind) { case TargetEndian_Little: - return !is_type_integer_endian_little(t); + return !is_type_endian_little(t); case TargetEndian_Big: - return !is_type_integer_endian_big(t); + return !is_type_endian_big(t); } return false; } |