summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2019-02-23 12:33:35 +0800
committerJohn Hodge <tpg@mutabah.net>2019-02-23 12:33:35 +0800
commit0158e0e303cf2b9ba38a8e482df9bacb4fd4c779 (patch)
treec7cf3d8d0c7492b425bf94fd9b4d8eefecea9794 /src
parent80c2add7b04e6e202d9a4f3b3c25ec498e3b5893 (diff)
parent7d728e447d70d79e93c01a7c51efbd61be09d68f (diff)
downloadmrust-0158e0e303cf2b9ba38a8e482df9bacb4fd4c779.tar.gz
Merge branch 'master' of ssh://github.com/thepowersgang/mrustc
Diffstat (limited to 'src')
-rw-r--r--src/expand/proc_macro.cpp2
-rw-r--r--src/hir/hir.cpp4
-rw-r--r--src/trans/codegen_mmir.cpp24
-rw-r--r--src/trans/target.cpp16
4 files changed, 33 insertions, 13 deletions
diff --git a/src/expand/proc_macro.cpp b/src/expand/proc_macro.cpp
index 3f26c648..b61851b3 100644
--- a/src/expand/proc_macro.cpp
+++ b/src/expand/proc_macro.cpp
@@ -977,7 +977,7 @@ uint64_t ProcMacroInv::recv_v128u()
for(;;)
{
auto b = recv_u8();
- v |= static_cast<uint64_t>(b) << ofs;
+ v |= static_cast<uint64_t>(b & 0x7F) << ofs;
if( (b & 0x80) == 0 )
break;
ofs += 7;
diff --git a/src/hir/hir.cpp b/src/hir/hir.cpp
index 9f9bc1c3..5d67ac5f 100644
--- a/src/hir/hir.cpp
+++ b/src/hir/hir.cpp
@@ -450,7 +450,9 @@ namespace {
),
(Function,
TU_IFLET(::HIR::TypeRef::Data, right.m_data, Function, re,
- TODO(sp, "Function");
+ if( left == right )
+ return ::OrdEqual;
+ TODO(sp, "Function - " << left << " and " << right);
//return typelist_ord_specific(sp, le.arg_types, re.arg_types);
)
else {
diff --git a/src/trans/codegen_mmir.cpp b/src/trans/codegen_mmir.cpp
index b2c5282a..73de19d3 100644
--- a/src/trans/codegen_mmir.cpp
+++ b/src/trans/codegen_mmir.cpp
@@ -18,6 +18,14 @@
namespace
{
+ size_t Target_GetSizeOf_Required(const Span& sp, const StaticTraitResolve& resolve, const ::HIR::TypeRef& ty)
+ {
+ size_t size;
+ bool type_has_size = Target_GetSizeOf(sp, resolve, ty, size);
+ ASSERT_BUG(sp, type_has_size, "Attempting to get the size of a unsized type");
+ return size;
+ }
+
template<typename T>
struct Fmt
{
@@ -324,7 +332,7 @@ namespace
else if( t.m_data.is_Slice() ) {
return ::HIR::CoreType::Usize;
}
- else if( t.m_data.is_TraitObject() ) {
+ else if( t.m_data.is_TraitObject() ) {
const auto& te = t.m_data.as_TraitObject();
//auto vtp = t.m_data.as_TraitObject().m_trait.m_path;
@@ -381,7 +389,7 @@ namespace
{
m_of << "fn " << drop_glue_path << "(&move " << ty << ") {\n";
m_of << "\tlet unit: ();\n";
-
+
if( const auto* ity = m_resolve.is_type_owned_box(ty) )
{
m_of << "\t0: {\n";
@@ -779,8 +787,7 @@ namespace
cur_ofs ++;
}
emit_literal_as_bytes(le[i], repr->fields[i].ty, out_relocations, base_ofs + cur_ofs);
- size_t size;
- assert(Target_GetSizeOf(sp, m_resolve, repr->fields[i].ty, size));
+ size_t size = Target_GetSizeOf_Required(sp, m_resolve, repr->fields[i].ty);
cur_ofs += size;
}
while(cur_ofs < repr->size)
@@ -803,8 +810,7 @@ namespace
emit_literal_as_bytes(*le.val, repr->fields[le.idx].ty, out_relocations, base_ofs + cur_ofs);
- size_t size;
- assert(Target_GetSizeOf(sp, m_resolve, repr->fields[le.idx].ty, size));
+ size_t size = Target_GetSizeOf_Required(sp, m_resolve, repr->fields[le.idx].ty);
cur_ofs += size;
}
@@ -819,8 +825,7 @@ namespace
auto v = ::HIR::Literal::make_Integer(le.idx);
emit_literal_as_bytes(v, repr->fields[ve->field.index].ty, out_relocations, base_ofs + cur_ofs);
- size_t size;
- assert(Target_GetSizeOf(sp, m_resolve, repr->fields[ve->field.index].ty, size));
+ size_t size = Target_GetSizeOf_Required(sp, m_resolve, repr->fields[ve->field.index].ty);
cur_ofs += size;
}
// TODO: Nonzero?
@@ -888,8 +893,7 @@ namespace
for(const auto& v : lit.as_List())
{
emit_literal_as_bytes(v, *te.inner, out_relocations, base_ofs);
- size_t size;
- assert(Target_GetSizeOf(sp, m_resolve, *te.inner, size));
+ size_t size = Target_GetSizeOf(sp, m_resolve, *te.inner, size);
base_ofs += size;
}
} break;
diff --git a/src/trans/target.cpp b/src/trans/target.cpp
index 53d84030..70996fb0 100644
--- a/src/trans/target.cpp
+++ b/src/trans/target.cpp
@@ -42,7 +42,7 @@ const TargetArch ARCH_M68K = {
"m68k",
32, true,
{ /*atomic(u8)=*/true, false, true, false, true },
- TargetArch::Alignments(2, 4, 8, 16, 4, 8, 4) // TODO: Does m68k have lower alignments?
+ TargetArch::Alignments(2, 2, 2, 2, 2, 2, 2)
};
TargetSpec g_target;
@@ -511,6 +511,20 @@ namespace
ARCH_X86_64
};
}
+ else if(target_name == "arm-unknown-haiku")
+ {
+ return TargetSpec {
+ "unix", "haiku", "gnu", {CodegenMode::Gnu11, true, "arm-unknown-haiku", {}, {}},
+ ARCH_ARM32
+ };
+ }
+ else if(target_name == "x86_64-unknown-haiku")
+ {
+ return TargetSpec {
+ "unix", "haiku", "gnu", {CodegenMode::Gnu11, false, "x86_64-unknown-haiku", {}, {}},
+ ARCH_X86_64
+ };
+ }
else
{
::std::cerr << "Unknown target name '" << target_name << "'" << ::std::endl;