From a9741bd33d7e55401f506bb82b99411d03ce7e3f Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 27 Mar 2013 17:55:18 -0700 Subject: [PATCH 1/6] Update LLVM for ARM changes --- src/llvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm b/src/llvm index accc36b3e3f22..56dd407f4f97a 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit accc36b3e3f22319b16609460f4cdf964f33f6cb +Subproject commit 56dd407f4f97a01b8df6554c569170d2fc276fcb From 4b4f48283bdd71fa106f1e2ce80c6d2a0d2aff36 Mon Sep 17 00:00:00 2001 From: Young-il Choi Date: Wed, 20 Mar 2013 20:24:39 +0900 Subject: [PATCH 2/6] rustllvm: followup latest LLVM --- src/rustllvm/RustWrapper.cpp | 20 +++++++++++++------- src/rustllvm/rustllvm.def.in | 2 -- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index bdf13746f3ebf..68483b0280f4a 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -15,14 +15,12 @@ // //===----------------------------------------------------------------------=== -#include "llvm/InlineAsm.h" -#include "llvm/LLVMContext.h" #include "llvm/Linker.h" #include "llvm/PassManager.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/LLVMContext.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Analysis/Passes.h" -#include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/IPO.h" #include "llvm/ADT/Triple.h" #include "llvm/ADT/DenseSet.h" #include "llvm/Assembly/Parser.h" @@ -31,11 +29,9 @@ #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetMachine.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/SourceMgr.h" -#include "llvm/Target/TargetOptions.h" #include "llvm/Support/Host.h" #include "llvm/Support/Debug.h" #include "llvm/Support/DynamicLibrary.h" @@ -45,6 +41,10 @@ #include "llvm/ExecutionEngine/JITMemoryManager.h" #include "llvm/ExecutionEngine/MCJIT.h" #include "llvm/ExecutionEngine/Interpreter.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetOptions.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/IPO.h" #include "llvm-c/Core.h" #include "llvm-c/BitReader.h" #include "llvm-c/Object.h" @@ -218,6 +218,12 @@ class RustMCJITMemoryManager : public JITMemoryManager { virtual void deallocateExceptionTable(void *ET) { llvm_unreachable("Unimplemented call"); } + virtual uint8_t* allocateDataSection(uintptr_t, unsigned int, unsigned int, bool) { + llvm_unreachable("Unimplemented call"); + } + virtual bool applyPermissions(std::string*) { + llvm_unreachable("Unimplemented call"); + } }; bool RustMCJITMemoryManager::loadCrate(const char* file, std::string* err) { @@ -481,7 +487,7 @@ extern "C" LLVMModuleRef LLVMRustParseAssemblyFile(const char *Filename) { if (m) { return wrap(m); } else { - LLVMRustError = d.getMessage().c_str(); + LLVMRustError = d.getMessage().data(); return NULL; } } diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in index 8b1c9d5ec7fbc..73bf1af90cd34 100644 --- a/src/rustllvm/rustllvm.def.in +++ b/src/rustllvm/rustllvm.def.in @@ -383,8 +383,6 @@ LLVMInitializeInstCombine LLVMInitializeScalarOpts LLVMInitializeTarget LLVMInitializeTransformUtils -LLVMInitializeARMAsmLexer -LLVMInitializeX86AsmLexer LLVMInitializeARMAsmParser LLVMInitializeMipsAsmParser LLVMInitializeX86AsmParser From 3d0d144283959bf62368f6965aae14ce95ee286b Mon Sep 17 00:00:00 2001 From: ILyoan Date: Fri, 22 Feb 2013 15:17:54 +0900 Subject: [PATCH 3/6] rust morestack assembly for arm Conflicts: src/rt/arch/arm/morestack.S --- src/rt/arch/arm/morestack.S | 55 ++++++++++++++++++++++++++++++++++++- src/rt/arch/arm/record_sp.S | 47 ++++--------------------------- 2 files changed, 60 insertions(+), 42 deletions(-) diff --git a/src/rt/arch/arm/morestack.S b/src/rt/arch/arm/morestack.S index 1afce5bd848b7..3af8e898cdbcf 100644 --- a/src/rt/arch/arm/morestack.S +++ b/src/rt/arch/arm/morestack.S @@ -8,6 +8,59 @@ .arm .align -.globl __morestack +.global upcall_new_stack +.global upcall_del_stack +.global __morestack .hidden __morestack + +// r4 and r5 are scratch registers for __morestack due to llvm +// ARMFrameLowering::adjustForSegmentedStacks() implementation. + .align 2 + .type __morestack,%function __morestack: + + // Save frame pointer and return address + push {fp, lr} + + mov fp, sp + + // Save argument registers of the original function + push {r0, r1, r2, r3, lr} + + mov r0, r4 // The amount of stack needed + add r1, fp, #20 // Address of stack arguments + mov r2, r5 // Size of stack arguments + + // Create new stack + bl upcall_new_stack@plt + + // Hold new stack pointer + mov r5, r0 + + // Pop the saved arguments + pop {r0, r1, r2, r3, lr} + + // Grab the return pointer + add r4, lr, #16 // Skip past the return + mov sp, r5 // Swich to the new stack + mov lr, pc + mov pc, r4 // Call the original function + + // Switch back to rust stack + mov sp, fp + + // Save return value + push {r0, r1} + + // Remove the new allocated stack + bl upcall_del_stack@plt + + // Restore return value + pop {r0, r1} + + // Return + pop {fp, lr} + mov pc, lr +.endofmorestack: + .size __morestack, .endofmorestack-__morestack + diff --git a/src/rt/arch/arm/record_sp.S b/src/rt/arch/arm/record_sp.S index abd8fbb6a5b05..fe680004a89aa 100644 --- a/src/rt/arch/arm/record_sp.S +++ b/src/rt/arch/arm/record_sp.S @@ -14,53 +14,18 @@ .globl get_sp record_sp_limit: - mov r3, r0 - ldr r0, =my_cpu - mov r1, #0 - mov r2, #0 - stmfd sp!, {r3, r7} - ldr r7, =345 - swi #0 - ldmfd sp!, {r3, r7} - movs r0, r0 - movmi r0, #0 - - ldr r1, =my_array - str r3, [r1, r0] + mrc p15, #0, r3, c13, c0, #3 + add r3, r3, #252 + str r0, [r3] mov pc, lr - get_sp_limit: - ldr r0, =my_cpu - mov r1, #0 - mov r2, #0 - stmfd sp!, {r4, r7} - ldr r7, =345 - swi #0 - ldmfd sp!, {r4, r7} - movs r0, r0 - movmi r0, #0 - mov r3, r0 - - ldr r1, =my_array - ldr r0, [r1, r3] + mrc p15, #0, r3, c13, c0, #3 + add r3, r3, #252 + ldr r0, [r3] mov pc, lr - get_sp: mov r0, sp mov pc, lr -.data -my_cpu: .long 0 -.global my_array -my_array: - .long 0 - .long 0 - .long 0 - .long 0 - .long 0 - .long 0 - .long 0 - .long 0 -.end From 344628fe91ffa0fad32bc5b3eee3e6b4b48c9990 Mon Sep 17 00:00:00 2001 From: ILyoan Date: Wed, 13 Mar 2013 17:22:01 +0900 Subject: [PATCH 4/6] FIX meta_section_name for macos --- src/librustc/metadata/loader.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs index 9c61205667750..cfe9c8cd40a66 100644 --- a/src/librustc/metadata/loader.rs +++ b/src/librustc/metadata/loader.rs @@ -206,7 +206,8 @@ fn get_metadata_section(os: os, while llvm::LLVMIsSectionIteratorAtEnd(of.llof, si.llsi) == False { let name_buf = llvm::LLVMGetSectionName(si.llsi); let name = unsafe { str::raw::from_c_str(name_buf) }; - if name == meta_section_name(os) { + debug!("get_matadata_section: name %s", name); + if name == read_meta_section_name(os) { let cbuf = llvm::LLVMGetSectionContents(si.llsi); let csz = llvm::LLVMGetSectionSize(si.llsi) as uint; let mut found = None; @@ -251,6 +252,16 @@ pub fn meta_section_name(os: os) -> ~str { } } +pub fn read_meta_section_name(os: os) -> ~str { + match os { + os_macos => ~"__note.rustc", + os_win32 => ~".note.rustc", + os_linux => ~".note.rustc", + os_android => ~".note.rustc", + os_freebsd => ~".note.rustc" + } +} + // A diagnostic function for dumping crate metadata to an output stream pub fn list_file_metadata(intr: @ident_interner, os: os, From a34948a2c5d7cd296abda6970652a9513d67feb7 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 28 Mar 2013 16:47:33 -0700 Subject: [PATCH 5/6] rustllvm: Initialize target analysis passes Without this the target info for certain optimizations will not be created and the compiler will sometimes crash --- src/rustllvm/RustWrapper.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 68483b0280f4a..5d422b2d2edc3 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -452,6 +452,8 @@ LLVMRustWriteOutputFile(LLVMPassManagerRef PMR, Options.NoFramePointerElim = true; Options.EnableSegmentedStacks = EnableSegmentedStacks; + PassManager *PM = unwrap(PMR); + std::string Err; std::string Trip(Triple::normalize(triple)); std::string FeaturesStr; @@ -461,8 +463,9 @@ LLVMRustWriteOutputFile(LLVMPassManagerRef PMR, TheTarget->createTargetMachine(Trip, CPUStr, FeaturesStr, Options, Reloc::PIC_, CodeModel::Default, OptLevel); + Target->addAnalysisPasses(*PM); + bool NoVerify = false; - PassManager *PM = unwrap(PMR); std::string ErrorInfo; raw_fd_ostream OS(path, ErrorInfo, raw_fd_ostream::F_Binary); From 03116f251d2d53842971b356fb320f6101d1a3e5 Mon Sep 17 00:00:00 2001 From: ILyoan Date: Tue, 19 Mar 2013 14:28:10 +0900 Subject: [PATCH 6/6] add unwind information on morestack --- src/rt/arch/arm/morestack.S | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/rt/arch/arm/morestack.S b/src/rt/arch/arm/morestack.S index 3af8e898cdbcf..4f1431a33927a 100644 --- a/src/rt/arch/arm/morestack.S +++ b/src/rt/arch/arm/morestack.S @@ -15,14 +15,19 @@ // r4 and r5 are scratch registers for __morestack due to llvm // ARMFrameLowering::adjustForSegmentedStacks() implementation. - .align 2 - .type __morestack,%function + .type __morestack,%function __morestack: + .fnstart + // Save frame pointer and return address + .save {r4, r5} + .save {lr} + .save {r6, fp, lr} + push {r6, fp, lr} - // Save frame pointer and return address - push {fp, lr} - - mov fp, sp + .movsp r6 + mov r6, sp + .setfp fp, sp, #4 + add fp, sp, #4 // Save argument registers of the original function push {r0, r1, r2, r3, lr} @@ -47,20 +52,20 @@ __morestack: mov pc, r4 // Call the original function // Switch back to rust stack - mov sp, fp + mov sp, r6 // Save return value - push {r0, r1} + mov r4, r0 + mov r5, r1 // Remove the new allocated stack bl upcall_del_stack@plt // Restore return value - pop {r0, r1} - + mov r0, r4 + mov r1, r5 + // Return - pop {fp, lr} + pop {r6, fp, lr} mov pc, lr -.endofmorestack: - .size __morestack, .endofmorestack-__morestack - + .fnend