summaryrefslogtreecommitdiff
path: root/src/trans/target.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2018-02-04 17:38:57 +0800
committerJohn Hodge <tpg@mutabah.net>2018-02-04 17:38:57 +0800
commit8fb6df4340c186fbc391b18dc026cd868f74b6ac (patch)
tree85c05f467fad90da983f77dfa6fba971e3cc3ef7 /src/trans/target.cpp
parent05e399b35d71118b375510d35ca5a89876bcbfcd (diff)
downloadmrust-8fb6df4340c186fbc391b18dc026cd868f74b6ac.tar.gz
Trans - mingw32 target attempt (still being worked on)
Diffstat (limited to 'src/trans/target.cpp')
-rw-r--r--src/trans/target.cpp32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/trans/target.cpp b/src/trans/target.cpp
index cf4d0fbc..d1a5cabe 100644
--- a/src/trans/target.cpp
+++ b/src/trans/target.cpp
@@ -66,6 +66,13 @@ namespace
ARCH_ARM32
};
}
+ else if(target_name == "i586-windows-gnu")
+ {
+ return TargetSpec {
+ "windows", "windows", "gnu", CodegenMode::Gnu11, "mingw32",
+ ARCH_X86
+ };
+ }
else if(target_name == "x86_64-windows-gnu")
{
return TargetSpec {
@@ -750,17 +757,17 @@ namespace {
}
else if( e.variants.size() == 1 ) {
}
- else if( e.variants.size() <= 255 ) {
- rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::U8 });
+ else if( e.variants.size() <= 128 ) {
+ rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::I8 });
}
- else if( e.variants.size() <= 0xFFFF ) {
- rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::U16 });
+ else if( e.variants.size() <= 0x7FFF ) {
+ rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::I16 });
}
- else if( e.variants.size() <= 0xFFFFFFFF ) {
- rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::U32 });
+ else if( e.variants.size() <= 0x7FFFFFFF ) {
+ rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::I32 });
}
else {
- rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::U64 });
+ rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::I64 });
}
break;
case ::HIR::Enum::Repr::U8:
@@ -870,3 +877,14 @@ const TypeRepr* Target_GetTypeRepr(const Span& sp, const StaticTraitResolve& res
auto ires = s_cache.insert(::std::make_pair( ty.clone(), make_type_repr(sp, resolve, ty) ));
return ires.first->second.get();
}
+const ::HIR::TypeRef& Target_GetInnerType(const Span& sp, const StaticTraitResolve& resolve, const TypeRepr& repr, size_t idx, const ::std::vector<size_t>& sub_fields, size_t ofs)
+{
+ const auto& ty = repr.fields.at(idx).ty;
+ if( sub_fields.size() == ofs )
+ {
+ return ty;
+ }
+ const auto* inner_repr = Target_GetTypeRepr(sp, resolve, ty);
+ ASSERT_BUG(sp, inner_repr, "No inner repr for " << ty);
+ return Target_GetInnerType(sp, resolve, *inner_repr, sub_fields[ofs], sub_fields, ofs+1);
+}