about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-05-17 18:19:27 -0700
committerbors <bors@rust-lang.org>2013-05-17 18:19:27 -0700
commitd68c0279eadc8544a1e3c1d9077185500a36ae66 (patch)
tree9f1c22f6d98d4619ac63350828d584b9924582a8
parent2d28d645422c1617be58c8ca7ad9a457264ca850 (diff)
parent48b6262b383365b7319ef76fa9c6d2c63c4d70e1 (diff)
downloadrust-d68c0279eadc8544a1e3c1d9077185500a36ae66.tar.gz
rust-d68c0279eadc8544a1e3c1d9077185500a36ae66.zip
auto merge of #6249 : crabtw/rust/arm, r=brson
It uses the private field of TCB head to store stack limit. I tested on my Raspberry PI. A simple hello world program ran without any problem. However, for a more complex program, it segfaulted as #6231.
-rw-r--r--mk/platform.mk26
-rw-r--r--mk/rt.mk4
-rw-r--r--src/librustc/back/arm.rs2
-rw-r--r--src/rt/arch/arm/record_sp.S8
-rw-r--r--src/rt/rust_task.h3
5 files changed, 42 insertions, 1 deletions
diff --git a/mk/platform.mk b/mk/platform.mk
index efba83e6ad4..ba1cbc32f54 100644
--- a/mk/platform.mk
+++ b/mk/platform.mk
@@ -239,6 +239,32 @@ CFG_RUN_arm-linux-androideabi=
 CFG_RUN_TARG_arm-linux-androideabi=
 RUSTC_FLAGS_arm-linux-androideabi :=--android-cross-path=$(CFG_ANDROID_CROSS_PATH)
 
+# arm-unknown-linux-gnueabihf configuration
+CC_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-gcc
+CXX_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-g++
+CPP_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-gcc -E
+AR_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-ar
+CFG_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).so
+CFG_LIB_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.so
+CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.dylib.dSYM
+CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC
+CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabihf := -fno-rtti
+CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabihf := -shared -fPIC -g
+CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabihf := -Wl,--export-dynamic,--dynamic-list=
+CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-whole-archive
+CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-no-whole-archive
+CFG_DEF_SUFFIX_arm-unknown-linux-gnueabihf := .linux.def
+CFG_INSTALL_NAME_ar,-unknown-linux-gnueabihf =
+CFG_LIBUV_LINK_FLAGS_arm-unknown-linux-gnueabihf =
+CFG_EXE_SUFFIX_arm-unknown-linux-gnueabihf :=
+CFG_WINDOWSY_arm-unknown-linux-gnueabihf :=
+CFG_UNIXY_arm-unknown-linux-gnueabihf := 1
+CFG_PATH_MUNGE_arm-unknown-linux-gnueabihf := true
+CFG_LDPATH_arm-unknown-linux-gnueabihf :=
+CFG_RUN_arm-unknown-linux-gnueabihf=
+CFG_RUN_TARG_arm-unknown-linux-gnueabihf=
+RUSTC_FLAGS_arm-unknown-linux-gnueabihf := --linker=$(CC_arm-unknown-linux-gnueabihf)
+
 # mips-unknown-linux-gnu configuration
 CC_mips-unknown-linux-gnu=mips-linux-gnu-gcc
 CXX_mips-unknown-linux-gnu=mips-linux-gnu-g++
diff --git a/mk/rt.mk b/mk/rt.mk
index ab91dca6218..2087945afb5 100644
--- a/mk/rt.mk
+++ b/mk/rt.mk
@@ -26,7 +26,11 @@
 # Hack for passing flags into LIBUV, see below.
 LIBUV_FLAGS_i386 = -m32 -fPIC
 LIBUV_FLAGS_x86_64 = -m64 -fPIC
+ifeq ($(OSTYPE_$(1)), linux-androideabi)
 LIBUV_FLAGS_arm = -fPIC -DANDROID -std=gnu99
+else
+LIBUV_FLAGS_arm = -fPIC -std=gnu99
+endif
 LIBUV_FLAGS_mips = -fPIC -mips32r2 -msoft-float -mabi=32
 
 # when we're doing a snapshot build, we intentionally degrade as many
diff --git a/src/librustc/back/arm.rs b/src/librustc/back/arm.rs
index dfe5751f21b..ff3c71da458 100644
--- a/src/librustc/back/arm.rs
+++ b/src/librustc/back/arm.rs
@@ -64,7 +64,7 @@ pub fn get_target_strs(target_os: session::os) -> target_strs::t {
         target_triple: match target_os {
           session::os_macos => ~"arm-apple-darwin",
           session::os_win32 => ~"arm-pc-mingw32",
-          session::os_linux => ~"arm-unknown-linux",
+          session::os_linux => ~"arm-unknown-linux-gnueabihf",
           session::os_android => ~"arm-linux-androideabi",
           session::os_freebsd => ~"arm-unknown-freebsd"
         },
diff --git a/src/rt/arch/arm/record_sp.S b/src/rt/arch/arm/record_sp.S
index 95fce8746a1..8d5f24bc5a8 100644
--- a/src/rt/arch/arm/record_sp.S
+++ b/src/rt/arch/arm/record_sp.S
@@ -15,13 +15,21 @@
 
 record_sp_limit:
 	mrc p15, #0, r3, c13, c0, #3
+#if __ANDROID__
 	add r3, r3, #252
+#elif __linux__
+	add r3, r3, #4
+#endif
 	str r0, [r3]
 	mov pc, lr
 
 get_sp_limit:
 	mrc p15, #0, r3, c13, c0, #3
+#if __ANDROID__
 	add r3, r3, #252
+#elif __linux__
+	add r3, r3, #4
+#endif
 	ldr r0, [r3]
 	mov pc, lr
 
diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h
index 672af608db8..213aee6a9eb 100644
--- a/src/rt/rust_task.h
+++ b/src/rt/rust_task.h
@@ -146,6 +146,9 @@
 #ifdef __mips__
 #define RED_ZONE_SIZE RZ_MAC_32
 #endif
+#ifdef __arm__
+#define RED_ZONE_SIZE RZ_LINUX_32
+#endif
 #endif
 #ifdef __APPLE__
 #ifdef __i386__