diff --git a/mk/intrinsics.mk b/mk/intrinsics.mk index 77442ec530a..2a43b7c1667 100644 --- a/mk/intrinsics.mk +++ b/mk/intrinsics.mk @@ -11,7 +11,7 @@ $(INTRINSICS_LL): $(INTRINSICS_LL_IN) $(MKFILES) @$(call E, mkdir: intrinsics) $(Q)mkdir -p intrinsics @$(call E, sed: $@) - $(Q)sed s/@CFG_LLVM_TRIPLE@/$(CFG_LLVM_TRIPLE)/g $< > $@ + $(Q)sed s/@CFG_TARGET_TRIPLE@/$(CFG_LLVM_TRIPLE)/g $< > $@ $(INTRINSICS_BC): $(INTRINSICS_LL) $(MKFILES) @$(call E, llvm-as: $@) diff --git a/mk/rt.mk b/mk/rt.mk index ff6d24def1c..a486edd6ea8 100644 --- a/mk/rt.mk +++ b/mk/rt.mk @@ -103,6 +103,8 @@ RUNTIME_INCS := -I $(S)src/rt/isaac -I $(S)src/rt/uthash \ RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o) $(RUNTIME_LL:.ll=.o) $(RUNTIME_S:.S=.o) RUNTIME_LIBS := $(LIBUV_LIB) +RT_COMPILE_C := $(call CFG_COMPILE_C, $(0), $(1) -I $(S)src/rt/arch/$(2)) + rt/%.o: rt/%.cpp $(MKFILES) @$(call E, compile: $@) $(Q)$(call CFG_COMPILE_C, $@, $(RUNTIME_INCS)) $< diff --git a/mk/target.mk b/mk/target.mk index 9f0739bfb7a..1b1d177e20f 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -7,9 +7,19 @@ define TARGET_STAGE_N -$$(TARGET_LIB$(1)$(2))/intrinsics.bc: $$(INTRINSICS_BC) - @$$(call E, cp: $$@) - $$(Q)cp $$< $$@ +TARGET_HOST := $$(word 1,$$(subst -, ,$(2))) + +# For some reason there is (sometimes) a mismatch here between i686, i386, etc +INTR_HOST := $$(subst i686,i386,$$(TARGET_HOST)) + +$$(TARGET_LIB$(1)$(2))/intrinsics.ll: \ + $$(S)src/rt/intrinsics/intrinsics.$$(INTR_HOST).ll.in + @$$(call E, sed: $$@) + sed s/@CFG_TARGET_TRIPLE@/$(2)/ $$< > $$@ + +$$(TARGET_LIB$(1)$(2))/intrinsics.bc: $$(TARGET_LIB$(1)$(2))/intrinsics.ll + @$$(call E, llvms-as: $$@) + $$(LLVM_AS) -o $$@ $$< $$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB): \ $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \ diff --git a/src/etc/gen-intrinsics b/src/etc/gen-intrinsics new file mode 100755 index 00000000000..45fd5482f4a --- /dev/null +++ b/src/etc/gen-intrinsics @@ -0,0 +1,19 @@ +#!/bin/sh + +# This script generates new definitions for the intrinsics using +# clang. This is not currently in the Makefile to avoid any dependency +# on clang. + +for ARCH in i386 x86_64 +do + clang++ -emit-llvm -S -arch $ARCH -O3 -Isrc/rt/isaac -Isrc/rt/uthash \ + -Isrc/rt/arch/$ARCH -fno-stack-protector \ + -o src/rt/intrinsics/intrinsics.$ARCH.ll.in \ + src/rt/intrinsics/intrinsics.cpp + sed -i "" \ + -e 's/^target datalayout =/; target datalayout =/' \ + src/rt/intrinsics/intrinsics.$ARCH.ll.in + sed -i "" \ + -e 's/^target triple = "[^"]*"/target triple = "@CFG_TARGET_TRIPLE@"/' \ + src/rt/intrinsics/intrinsics.$ARCH.ll.in +done \ No newline at end of file diff --git a/src/rt/intrinsics/intrinsics.ll.in b/src/rt/intrinsics/intrinsics.i386.ll.in similarity index 81% rename from src/rt/intrinsics/intrinsics.ll.in rename to src/rt/intrinsics/intrinsics.i386.ll.in index aabc5bcd245..93cc32fe995 100644 --- a/src/rt/intrinsics/intrinsics.ll.in +++ b/src/rt/intrinsics/intrinsics.i386.ll.in @@ -1,5 +1,6 @@ -; ModuleID = 'intrinsics.cpp' -target triple = "@CFG_LLVM_TRIPLE@" +; ModuleID = 'src/rt/intrinsics/intrinsics.cpp' +; target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" +target triple = "@CFG_TARGET_TRIPLE@" %0 = type { i32, %"struct.memory_region::alloc_header"**, i32 } %1 = type { i32, %struct.rust_scheduler**, i32 } @@ -52,10 +53,10 @@ target triple = "@CFG_LLVM_TRIPLE@" %struct.rust_vec = type { i32, i32, [0 x i8] } %"struct.std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_Rb_tree_impl" = type { %struct.rust_cond, %"struct.std::_Rb_tree_node_base", i32 } %"struct.std::_Rb_tree_node_base" = type { i32, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* } -%struct.type_desc = type { %struct.type_desc**, i32, i32, void (i8*, i8*, %struct.type_desc**, i8*)*, void (i8*, i8*, %struct.type_desc**, i8*)*, void (i8*, i8*, %struct.type_desc**, i8*)*, i8*, void (i8*, i8*, %struct.type_desc**, i8*)*, void (i8*, i8*, %struct.type_desc**, i8*)*, i32, void (i8*, i8*, %struct.type_desc**, i8*, i8*, i8)*, i8*, %struct.rust_shape_tables*, i32, i32, %struct.UT_hash_handle, i32, [0 x %struct.type_desc*] } +%struct.type_desc = type { %struct.type_desc**, i32, i32, void (i8*, %struct.rust_task*, i8*, %struct.type_desc**, i8*)*, void (i8*, %struct.rust_task*, i8*, %struct.type_desc**, i8*)*, void (i8*, %struct.rust_task*, i8*, %struct.type_desc**, i8*)*, i8*, void (i8*, %struct.rust_task*, i8*, %struct.type_desc**, i8*)*, void (i8*, %struct.rust_task*, i8*, %struct.type_desc**, i8*)*, i32, void (i8*, %struct.rust_task*, i8*, %struct.type_desc**, i8*, i8*, i8)*, i8*, %struct.rust_shape_tables*, i32, i32, %struct.UT_hash_handle, i32, [0 x %struct.type_desc*] } @.str = private unnamed_addr constant [42 x i8] c"attempt to cast values of differing sizes\00" -@.str1 = private unnamed_addr constant [15 x i8] c"intrinsics.cpp\00" +@.str1 = private unnamed_addr constant [33 x i8] c"src/rt/intrinsics/intrinsics.cpp\00" define void @rust_intrinsic_vec_len(%struct.rust_task* nocapture %task, i32* nocapture %retptr, %struct.type_desc* nocapture %ty, %struct.rust_vec** nocapture %vp) nounwind { %1 = load %struct.rust_vec** %vp, align 4 @@ -77,7 +78,7 @@ define void @rust_intrinsic_ptr_offset(%struct.rust_task* nocapture %task, i8** ret void } -define void @rust_intrinsic_cast(%struct.rust_task* nocapture %task, i8* nocapture %retptr, %struct.type_desc* nocapture %t1, %struct.type_desc* nocapture %t2, i8* nocapture %src) { +define void @rust_intrinsic_cast(%struct.rust_task* %task, i8* nocapture %retptr, %struct.type_desc* nocapture %t1, %struct.type_desc* nocapture %t2, i8* nocapture %src) { %1 = getelementptr inbounds %struct.type_desc* %t1, i32 0, i32 1 %2 = load i32* %1, align 4 %3 = getelementptr inbounds %struct.type_desc* %t2, i32 0, i32 1 @@ -86,7 +87,7 @@ define void @rust_intrinsic_cast(%struct.rust_task* nocapture %task, i8* nocaptu br i1 %5, label %7, label %6 ;