diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_DLL.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_DLL.java
index f934408376f508f80b0035af089d84c9f1622f2f..c347fa64befb6fe6d5508d0c2f233a514fea326f 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_DLL.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_DLL.java
@@ -156,7 +156,7 @@ public class TruffleLLVM_DLL implements DLLRFFI {
 
     public static LLVMArchive getZipLLVMIR(String path) {
         List<String> nativeLibs = Collections.emptyList();
-        try (ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(path)))) {
+        try (ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(path + "l")))) {
             ArrayList<LLVM_IR> irList = new ArrayList<>();
             while (true) {
                 ZipEntry entry = zis.getNextEntry();
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Lapack.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Lapack.java
index 30ce4603df574624ec46e549067b233f1beae106..ff4dbdbb8c21537013d173e3d0dbd96277f51f19 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Lapack.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Lapack.java
@@ -56,6 +56,8 @@ final class TruffleLLVM_Lapack {
             callTarget = openLLVMLibraries();
         } else {
             callTarget = openNativeLibraries();
+            // libR must be loaded first to put the rpath mechanism in work. It's OS X specific.
+            callTarget.call(LibPaths.getBuiltinLibPath("R_dummy"), false, false);
             callTarget.call(LibPaths.getBuiltinLibPath("gcc_s"), false, true);
             callTarget.call(LibPaths.getBuiltinLibPath("quadmath"), false, true);
             callTarget.call(LibPaths.getBuiltinLibPath("gfortran"), false, true);
diff --git a/com.oracle.truffle.r.native/fficall/Makefile b/com.oracle.truffle.r.native/fficall/Makefile
index e6e0b6a202f5e7ebfec8c341944fe6501e0b5d8d..e156982011a50de3289755776f3ca46344e8cac8 100644
--- a/com.oracle.truffle.r.native/fficall/Makefile
+++ b/com.oracle.truffle.r.native/fficall/Makefile
@@ -36,7 +36,9 @@ endif
 C_LIBNAME := libR$(DYLIB_EXT)
 C_LIB := $(FASTR_LIB_DIR)/$(C_LIBNAME)
 R_LIBNAME := libR$(DYLIB_EXT)
+R_LIBNAME_DUMMY := libR_dummy$(DYLIB_EXT)
 R_LIB := $(FASTR_LIB_DIR)/$(R_LIBNAME)
+R_LIB_DUMMY := $(FASTR_LIB_DIR)/$(R_LIBNAME_DUMMY)
 
 ifeq ($(OS_NAME), Darwin)
 VERSION_FLAGS := -current_version $(R_VERSION) -compatibility_version $(R_VERSION)
@@ -56,16 +58,22 @@ ifeq ($(FASTR_RFFI),managed)
 	# nop
 else
 ifeq ($(OS_NAME),Darwin)
-	$(DYLIB_LD) $(DYLIB_LDFLAGS) -Wl,-rpath,@loader_path/ -o $(R_LIB) $(wildcard lib/*.o) -L$(FASTR_LIB_DIR) -ldl -lRblas -lRlapack  -lpcre -lz $(VERSION_FLAGS)
-ifneq ($(FASTR_RFFI),llvm)
+	FASTR_RFFI="nfi-only" $(DYLIB_LD) $(DYLIB_LDFLAGS) -Wl,-rpath,@loader_path/ -o $(R_LIB) $(wildcard lib/*.o) -L$(FASTR_LIB_DIR) -ldl -lRblas -lRlapack  -lpcre -lz $(VERSION_FLAGS)
+ifeq ($(FASTR_RFFI),llvm)
+	FASTR_RFFI="nfi-only" $(DYLIB_LD) $(DYLIB_LDFLAGS) -Wl,-rpath,@loader_path/ -o $(R_LIB_DUMMY) -L$(FASTR_LIB_DIR) -ldl -lRblas -lRlapack  -lpcre -lz $(VERSION_FLAGS)
+	FASTR_RFFI="llvm-only" $(DYLIB_LD) $(DYLIB_LDFLAGS) -Wl,-rpath,@loader_path/ -o $(R_LIB) $(wildcard lib/*.bc) -L$(FASTR_LIB_DIR) -ldl -lRblas -lRlapack  -lpcre -lz $(VERSION_FLAGS)
+endif
 	install_name_tool -change libRblas.dylib @rpath/libRblas.dylib $(R_LIB)
 	install_name_tool -change libRlapack.dylib @rpath/libRlapack.dylib $(R_LIB)
 	install_name_tool -id @rpath/libR.dylib $(R_LIB)
 # check if we captured libpcre/libz, rpath those in libR
 	mx rupdatelib $(FASTR_LIB_DIR)
-endif
 else
-	$(DYLIB_LD) $(DYLIB_LDFLAGS) $(shell echo $(PKG_LDFLAGS_OVERRIDE)) -Wl,-rpath,'$$ORIGIN' -o $(R_LIB) $(wildcard lib/*.o) -L$(FASTR_LIB_DIR) -lRblas -lRlapack -ldl -lpcre -lz
+	FASTR_RFFI="nfi-only" $(DYLIB_LD) $(DYLIB_LDFLAGS) $(shell echo $(PKG_LDFLAGS_OVERRIDE)) -Wl,-rpath,'$$ORIGIN' -o $(R_LIB) $(wildcard lib/*.o) -L$(FASTR_LIB_DIR) -lRblas -lRlapack -ldl -lpcre -lz
+ifeq ($(FASTR_RFFI),llvm)
+	FASTR_RFFI="nfi-only" $(DYLIB_LD) $(DYLIB_LDFLAGS) $(shell echo $(PKG_LDFLAGS_OVERRIDE)) -Wl,-rpath,'$$ORIGIN' -o $(R_LIB_DUMMY) -L$(FASTR_LIB_DIR) -lRblas -lRlapack -ldl -lpcre -lz
+	FASTR_RFFI="llvm-only" $(DYLIB_LD) $(DYLIB_LDFLAGS) $(shell echo $(PKG_LDFLAGS_OVERRIDE)) -Wl,-rpath,'$$ORIGIN' -o $(R_LIB) $(wildcard lib/*.bc) -L$(FASTR_LIB_DIR) -lRblas -lRlapack -ldl -lpcre -lz
+endif
 endif
 endif # managed
 
@@ -82,7 +90,8 @@ else
 ifeq ($(FASTR_RFFI),llvm)
 export R_PACKAGE_DIR="lib"
 fficall.done: common.done
-	$(MAKE) -C src/truffle_llvm all
+	$(MAKE) FASTR_RFFI="nfi-only" -C src/truffle_nfi all
+	$(MAKE) FASTR_RFFI="llvm-only" -C src/truffle_llvm all
 	touch fficall.done
 else
 	$(error unknown value for FASTR_RFFI)
@@ -91,6 +100,7 @@ endif #nfi
 endif #managed
 
 common.done:
+	echo "src/common FASTR_RFFI: $(FASTR_RFFI)"
 	$(MAKE) -C src/common all
 	touch common.done
 
@@ -100,6 +110,7 @@ ifeq ($(FASTR_RFFI),nfi)
 	$(MAKE) -C src/truffle_nfi clean
 else
 ifeq ($(FASTR_RFFI),llvm)
+	$(MAKE) -C src/truffle_nfi clean
 	$(MAKE) -C src/truffle_llvm clean
 else
 ifneq ($(FASTR_RFFI),managed)
@@ -108,5 +119,7 @@ endif
 endif
 endif
 	rm -rf $(R_LIB)
+	rm -rf $(R_LIB_DUMMY)
+	rm -rf "$(R_LIB)l"
 	rm -rf fficall.done
 	rm -rf common.done
diff --git a/com.oracle.truffle.r.native/fficall/src/common/Makefile b/com.oracle.truffle.r.native/fficall/src/common/Makefile
index 4b7fd7a6f081752e9ec151e538de6b4a54aa6bb7..f2a676b3e64f3d1f904913e0ec437c923f447922 100644
--- a/com.oracle.truffle.r.native/fficall/src/common/Makefile
+++ b/com.oracle.truffle.r.native/fficall/src/common/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -35,11 +35,7 @@ OBJ = ../../lib
 
 GNUR_APPL_C_FILES = pretty.c interv.c
 GNUR_APPL_SRC = $(GNUR_HOME)/src/appl
-ifneq ($(FASTR_RFFI),llvm)	
 GNUR_APPL_F_FILES := $(notdir $(wildcard $(GNUR_APPL_SRC)/d*.f))
-else
-GNUR_APPL_F_FILES :=
-endif
 
 GNUR_MAIN_C_FILES = colors.c devices.c engine.c format.c graphics.c plot.c plot3d.c plotmath.c rlocale.c sort.c
 GNUR_MAIN_SRC = $(GNUR_HOME)/src/main
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Makefile b/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Makefile
index d3e73486349e4fd724050112ba6f0070503ee048..41a01d74ab8c8c08cd7f95027f903b9939b881c6 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Makefile
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Makefile
@@ -33,33 +33,18 @@ endif
 
 include ../include/gnurheaders.mk
 
-# location of compiled code (.o files)
+# location of compiled code (.bc files)
 OBJ = ../../lib
 
-GNUR_APPL_C_FILES = pretty.c interv.c
-GNUR_APPL_SRC = $(GNUR_HOME)/src/appl
-GNUR_APPL_F_FILES := $(wildcard $(GNUR_APPL_SRC)/d*.f)
-
-GNUR_MAIN_C_FILES = colors.c devices.c engine.c format.c graphics.c plot.c plot3d.c plotmath.c rlocale.c sort.c
-GNUR_MAIN_SRC = $(GNUR_HOME)/src/main
-
-GNUR_C_OBJECTS := $(addprefix $(OBJ)/, $(GNUR_APPL_C_FILES:.c=.o) $(GNUR_MAIN_C_FILES:.c=.o))
-
-GNUR_F_OBJECTS := $(addprefix $(OBJ)/, $(notdir $(GNUR_APPL_F_FILES:.f=.o)))
-
 C_HDRS := $(wildcard *.h)
 
 LOCAL_C_SOURCES := $(wildcard *.c) 
-COMMON_C_SOURCES := $(wildcard ../common/*.c)
 TRUFFLE_COMMON_C_SOURCES := $(wildcard ../truffle_common/*.c)
 TRUFFLE_COMMON_H_SOURCES := $(wildcard ../truffle_common/*.h)
-C_SOURCES := $(LOCAL_C_SOURCES) $(COMMON_C_SOURCES) $(TRUFFLE_COMMON_C_SOURCES)
-#$(info C_SOURCES=$(C_SOURCES))
-LOCAL_C_OBJECTS := $(addprefix $(OBJ)/, $(LOCAL_C_SOURCES:.c=.o))
-COMMON_C_OBJECTS := $(addprefix $(OBJ)/, $(notdir $(COMMON_C_SOURCES:.c=.o)))
-TRUFFLE_COMMON_C_OBJECTS := $(addprefix $(OBJ)/, $(notdir $(TRUFFLE_COMMON_C_SOURCES:.c=.o)))
-C_OBJECTS := $(LOCAL_C_OBJECTS) $(COMMON_C_OBJECTS) $(TRUFFLE_COMMON_C_OBJECTS)
-#$(info C_OBJECTS=$(C_OBJECTS))
+C_SOURCES := $(LOCAL_C_SOURCES) $(TRUFFLE_COMMON_C_SOURCES)
+LOCAL_C_OBJECTS := $(addprefix $(OBJ)/, $(LOCAL_C_SOURCES:.c=.bc))
+TRUFFLE_COMMON_C_OBJECTS := $(addprefix $(OBJ)/, $(notdir $(TRUFFLE_COMMON_C_SOURCES:.c=.bc)))
+C_OBJECTS := $(LOCAL_C_OBJECTS) $(TRUFFLE_COMMON_C_OBJECTS)
 
 SULONG_DIR = $(abspath $(FASTR_R_HOME)/../sulong)
 
@@ -74,34 +59,18 @@ FFLAGS :=
 # uncomment to see exactly where headers are being read from
 #CFLAGS := $(CFLAGS) -H
 
-all: Makefile $(C_OBJECTS) $(GNUR_C_OBJECTS) $(GNUR_F_OBJECTS)
+all: Makefile $(C_OBJECTS)
 
 $(C_OBJECTS): | $(OBJ)
 
-$(GNUR_C_OBJECTS): | $(OBJ)
-
-$(GNUR_F_OBJECTS): | $(OBJ)
-
 $(OBJ):
 	mkdir -p $(OBJ)
 
-$(OBJ)/%.o: $(GNUR_APPL_SRC)/%.c
+$(OBJ)/%.bc: %.c $(FASTR_NATIVE_DIR)/include/Rinternals.h rffiutils.h $(TRUFFLE_COMMON_H_SOURCES) ../common/rffi_upcallsindex.h
 	$(CC) $(CFLAGS) $(INCLUDES) $(GNUR_HEADER_DEFS) $(SUPPRESS_WARNINGS) -c $< -o $@
 
-$(OBJ)/%.o: $(GNUR_MAIN_SRC)/%.c
-	$(CC) $(CFLAGS) $(INCLUDES) $(GNUR_HEADER_DEFS) $(SUPPRESS_WARNINGS) -c $< -o $@
-
-$(OBJ)/%.o: %.c $(FASTR_NATIVE_DIR)/include/Rinternals.h rffiutils.h $(TRUFFLE_COMMON_H_SOURCES) ../common/rffi_upcallsindex.h
-	$(CC) $(CFLAGS) $(INCLUDES) $(GNUR_HEADER_DEFS) $(SUPPRESS_WARNINGS) -c $< -o $@
-
-$(OBJ)/%.o: ../common/%.c $(FASTR_NATIVE_DIR)/include/Rinternals.h
-	$(CC) $(CFLAGS) $(INCLUDES) $(GNUR_HEADER_DEFS) $(SUPPRESS_WARNINGS) -c $< -o $@
-
-$(OBJ)/%.o: ../truffle_common/%.c 
+$(OBJ)/%.bc: ../truffle_common/%.c 
 	$(CC) $(CFLAGS) $(INCLUDES) $(SUPPRESS_WARNINGS) -c $< -o $@
 
-$(OBJ)/%.o: $(GNUR_APPL_SRC)/%.f
-	$(F77) $(FFLAGS) $(FPICFLAGS) -c $< -o $@
-
 clean:
 	rm -rf $(OBJ)
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Makefile b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Makefile
index 624b810ed068f1c62f96f9179b758135d5e2f8c9..b1c6cd0371f5f5c356b35cdf70687916c569be5a 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Makefile
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Makefile
@@ -36,11 +36,9 @@ LOCAL_C_SOURCES = $(wildcard *.c)
 TRUFFLE_COMMON_C_SOURCES := $(wildcard ../truffle_common/*.c)
 TRUFFLE_COMMON_H_SOURCES := $(wildcard ../truffle_common/*.h)
 C_SOURCES := $(LOCAL_C_SOURCES) $(TRUFFLE_COMMON_C_SOURCES)
-#$(info C_SOURCES=$(C_SOURCES))
 TRUFFLE_COMMON_C_OBJECTS := $(addprefix $(OBJ)/, $(notdir $(TRUFFLE_COMMON_C_SOURCES:.c=.o)))
 LOCAL_C_OBJECTS := $(patsubst %.c,$(OBJ)/%.o,$(LOCAL_C_SOURCES))
 C_OBJECTS := $(LOCAL_C_OBJECTS) $(TRUFFLE_COMMON_C_OBJECTS)
-#$(info C_OBJECTS=$(C_OBJECTS))
 
 FFI_INCLUDES = -I$(TOPDIR)/include -I$(TOPDIR)/include/R_ext
 #NFI_INCLUDES is set in environment (by mx)
diff --git a/com.oracle.truffle.r.native/gnur/patch/src/library/lib.mk b/com.oracle.truffle.r.native/gnur/patch/src/library/lib.mk
index 907b4c582df4ab44e94539ab769838777e676cc4..88192e1e2510988320288024a0573de83020262d 100644
--- a/com.oracle.truffle.r.native/gnur/patch/src/library/lib.mk
+++ b/com.oracle.truffle.r.native/gnur/patch/src/library/lib.mk
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -104,7 +104,10 @@ $(LIB_PKG): $(C_OBJECTS) $(F_OBJECTS) $(PKGDIR) $(XTRA_C_OBJECTS)
 	mkdir -p $(LIBDIR)
 	$(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_PKG) $(C_OBJECTS) $(F_OBJECTS) $(XTRA_C_OBJECTS) $(PKG_LIBS)
 	mkdir -p $(FASTR_LIBRARY_DIR)/$(PKG)/libs
-	cp $(LIB_PKG) $(FASTR_LIBRARY_DIR)/$(PKG)/libs
+	cp "$(LIB_PKG)" $(FASTR_LIBRARY_DIR)/$(PKG)/libs
+ifeq ($(FASTR_RFFI),llvm)
+	cp "$(LIB_PKG)l" $(FASTR_LIBRARY_DIR)/$(PKG)/libs
+endif
 ifeq ($(OS_NAME),Darwin)
 ifneq ($(FASTR_RFFI),llvm)	
 	install_name_tool -id @rpath/../library/$(PKG)/libs/$(PKG).so $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
diff --git a/com.oracle.truffle.r.native/llvm_tools/llvm-ar b/com.oracle.truffle.r.native/llvm_tools/llvm-ar
index 2045a4ef823ca58a12b1c07b6892882f551b0739..cad1d25390dae87ba8647845f350b431ce41db4e 100755
--- a/com.oracle.truffle.r.native/llvm_tools/llvm-ar
+++ b/com.oracle.truffle.r.native/llvm_tools/llvm-ar
@@ -22,9 +22,23 @@
 # questions.
 #
 
+if [[ "$FASTR_RFFI" != 'llvm-only' ]]; then
+	ar "$@"
+fi
+if [[ "$FASTR_RFFI" == 'nfi-only' ]]; then
+    exit 0
+fi
+
 SOURCE="$0"
 DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
 . $DIR/llvm-helper
 
-create_bc_archive $@
+errorOccurred || {
+try
+(
+	create_bc_archive $@
+) || catch || {
+	recordError
+}
+}
\ No newline at end of file
diff --git a/com.oracle.truffle.r.native/llvm_tools/llvm-c++ b/com.oracle.truffle.r.native/llvm_tools/llvm-c++
index b6fec6459e33f4cf536d8cfb8e1f10b427ce1eca..6fc323a14d6ef1ad28cb7cc3b0f19d719a242438 100755
--- a/com.oracle.truffle.r.native/llvm_tools/llvm-c++
+++ b/com.oracle.truffle.r.native/llvm_tools/llvm-c++
@@ -22,10 +22,22 @@
 # questions.
 #
 
+if [[ "$FASTR_RFFI" != 'llvm-only' ]]; then
+	g++ "$@"
+fi
+if [[ "$FASTR_RFFI" == 'nfi-only' ]]; then
+    exit 0
+fi
+
 SOURCE="$0"
 DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
 . $DIR/llvm-helper
+
+errorOccurred || {
+try
+(
+
 fortran=0
 analyze_args "$@"
 
@@ -56,10 +68,16 @@ else
     if [[ $ecode -ne 0 ]]; then
       exit $ecode
     fi
-    fake_obj
-    ecode=$?
-    if [[ $ecode -ne 0 ]]; then
-      exit $ecode
-    fi
+    #fake_obj
+    #ecode=$?
+    #if [[ $ecode -ne 0 ]]; then
+    #  exit $ecode
+    #fi
   fi
 fi
+
+) || catch || {
+	recordError
+}
+}
+
diff --git a/com.oracle.truffle.r.native/llvm_tools/llvm-cc b/com.oracle.truffle.r.native/llvm_tools/llvm-cc
index 62f42e6f3fbea9003a38ccbef3b190b2be83210a..e779733965863899078314cfe114adc42013c678 100755
--- a/com.oracle.truffle.r.native/llvm_tools/llvm-cc
+++ b/com.oracle.truffle.r.native/llvm_tools/llvm-cc
@@ -22,10 +22,22 @@
 # questions.
 #
 
+if [[ "$FASTR_RFFI" != 'llvm-only' ]]; then
+	gcc "$@"
+fi
+if [[ "$FASTR_RFFI" == 'nfi-only' ]]; then
+    exit 0
+fi
+
 SOURCE="$0"
 DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
 . $DIR/llvm-helper
+
+errorOccurred || {
+try
+(
+
 fortran=0
 analyze_args "$@"
 
@@ -52,10 +64,15 @@ else
     if [[ $ecode -ne 0 ]]; then
       exit $ecode
     fi
-    fake_obj
-    ecode=$?
-    if [[ $ecode -ne 0 ]]; then
-      exit $ecode
-    fi
+    #fake_obj
+    #ecode=$?
+    #if [[ $ecode -ne 0 ]]; then
+    #  exit $ecode
+    #fi
   fi
 fi
+
+) || catch || {
+	recordError
+}
+}
diff --git a/com.oracle.truffle.r.native/llvm_tools/llvm-fc b/com.oracle.truffle.r.native/llvm_tools/llvm-fc
index 03bd793753a3789d904cdb23a54af2d4c1d759e6..cc794a34e09994464d83523d49507aac16a6cc7e 100755
--- a/com.oracle.truffle.r.native/llvm_tools/llvm-fc
+++ b/com.oracle.truffle.r.native/llvm_tools/llvm-fc
@@ -22,10 +22,26 @@
 # questions.
 #
 
+echo "ARGS: $@"
+
+echo "llvm-fc FASTR_RFFI $FASTR_RFFI"
+
+if [[ "$FASTR_RFFI" != 'llvm-only' ]]; then
+	gfortran "$@"
+fi
+if [[ "$FASTR_RFFI" == 'nfi-only' ]]; then
+    exit 0
+fi
+
 SOURCE="$0"
 DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
 . $DIR/llvm-helper
+
+errorOccurred || {
+try
+(
+
 fortran=1
 analyze_args "$@"
 
@@ -53,7 +69,6 @@ function ll_to_bc() {
   llvm_ir_bc_file=${d}/${f%%.*}.bc
 }
 
-
 runit $FASTR_LLVM_GFORTRAN -fplugin=$FASTR_LLVM_DRAGONEGG -fplugin-arg-dragonegg-emit-ir $llvm_args
 ll_to_bc
 runit $FASTR_LLVM_GFORTRAN_LLVM_AS $llvm_ir_file -o $llvm_ir_bc_file
@@ -62,5 +77,10 @@ llvm_ir_file=$llvm_ir_bc_file
 # the llvm_ir_file is empty if the result is sent to stdout
 if [ -n "$llvm_ir_file" ]; then
   mem2reg_opt
-  fake_obj
+  #fake_obj
 fi
+
+) || catch || {
+	recordError
+}
+}
diff --git a/com.oracle.truffle.r.native/llvm_tools/llvm-helper b/com.oracle.truffle.r.native/llvm_tools/llvm-helper
index 4c04a4abebbc7548ccaf9c522369e0e741ea6656..2215a9037866d49db2a27bdc83743082777962a9 100644
--- a/com.oracle.truffle.r.native/llvm_tools/llvm-helper
+++ b/com.oracle.truffle.r.native/llvm_tools/llvm-helper
@@ -77,14 +77,14 @@ function analyze_args() {
         f=`basename $p`
         d=`dirname $p`
         ext=${f##*.}
-        if [ $ext == 'so' ] || [ $ext == 'dylib' ]
+        if [ $ext == 'so' ] || [ $ext == 'dylib' ] || [ $ext == 'sol' ] || [ $ext == 'dylibl' ]
         then
           is_link=1
-        elif [ $ext == 'o' ]
-		    then
-		      llvm_ir_file=${d}/${f%%.*}
-		      llvm_ir_file="${llvm_ir_file}${llvm_file_ext}"
-          llvm_ir_file_opt="-o ${llvm_ir_file}"
+        elif [ $ext == 'o' ] || [ $ext == 'bc' ]
+		then
+			llvm_ir_file=${d}/${f%%.*}
+		    llvm_ir_file="${llvm_ir_file}${llvm_file_ext}"
+         	llvm_ir_file_opt="-o ${llvm_ir_file}"
         else
           out_file_opt="-o $p"
         fi
@@ -147,12 +147,6 @@ function mem2reg_opt() {
    fi
 }
 
-function fake_obj() {
-  f=`basename $llvm_ir_file`
-  d=`dirname $llvm_ir_file`
-  runit touch ${d}/${f%%.*}.o
-}
-
 # Input: all the arguments to the original command line
 function create_bc_lib() {
   bcfiles=""
@@ -165,17 +159,17 @@ function create_bc_lib() {
     case $1 in
       -o)
         shift
-		    lib=$1
+		    lib="$1l"
         ;;
       -l*)
 		    linkedLib=`echo $1 | cut -c 3-`
         statLibFound='0'
         if [ -f "$statlibs" ]; then
-          statLibFound=`cat "$statlibs" | grep "lib${linkedLib}.a" | wc -l`
+          statLibFound=`cat "$statlibs" | grep "lib${linkedLib}.al" | wc -l`
         fi
         if [ $statLibFound == '0' ]
 		    then
-          echo $linkedLib >> $linkedLibs
+	          echo $linkedLib >> $linkedLibs
 		    fi
         ;;
       -*)
@@ -183,12 +177,12 @@ function create_bc_lib() {
         ;;
       *)
         f=$(basename $1)
-     	  ext=${f##*.}
-		    if [ $ext == 'o' ]
-		    then
-	  		   fn="$(dirname $1)/${f%%.*}.bc"
-			     bcfiles+="$fn "
-		    fi
+		ext=${f##*.}
+		if [ $ext == 'o' ] || [ $ext == 'bc' ]
+		then
+	  		fn="$(dirname $1)/${f%%.*}.bc"
+			bcfiles+="$fn "
+		fi
         ;;
     esac
     shift
@@ -204,6 +198,9 @@ function create_bc_lib() {
   runit $llvm_tool_bin $bcfiles -o $lib.bc
   runit zip -r $lib $lib.bc $linkedLibs
   rm $lib.bc
+  if [ -d "$R_PACKAGE_DIR/libs" ]; then
+    cp $lib "$R_PACKAGE_DIR/libs"
+  fi
 }
 
 # It appends objects constituting a static library to the list of extra object files.
@@ -220,7 +217,7 @@ function create_bc_archive() {
   # symbols objects (see below) to get the final list of objects to be linked with
   # the package dynamic library in the end.
   shift
-  archname=$1
+  archname="$1l"
   arargs="rcs $archname "
   shift
 
@@ -265,3 +262,39 @@ function create_bc_archive() {
   # Record the archive (static library) name to distinguish between LLVM static libs and native libs when linking (via -l)
   echo $archname >> "$R_PACKAGE_DIR/statlibs"
 }
+
+# A simple try-catch mimicking apparatus
+
+function try()
+{
+    [[ $- = *e* ]]; SAVED_OPT_E=$?
+    set -e
+}
+
+function throw()
+{
+    exit $1
+}
+
+function catch()
+{
+    export ex_code=$?
+    (( $SAVED_OPT_E )) && set +e
+    return $ex_code
+}
+
+function recordError()
+{
+	echo "***************************************************************"
+	echo "The LLVM build failed. Only the native libraries will be built."
+	echo "***************************************************************"
+
+	errorFlagFile="$R_PACKAGE_DIR/errorFlag"
+	touch $errorFlagFile
+}
+
+function errorOccurred()
+{
+	errorFlagFile="$R_PACKAGE_DIR/errorFlag"
+	[[ -f $errorFlagFile ]]
+}
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java
index fab1bc5db8463a71a681944a621c5e3dcd52c946..1369f5fffc2e5229bb01468d07f87d42e6918ec5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java
@@ -512,7 +512,7 @@ public class DLL {
 
     public static final String R_INIT_PREFIX = "R_init_";
 
-    public static class LoadPackageDLLNode extends Node {
+    public static final class LoadPackageDLLNode extends Node {
         @Child private InvokeVoidCallNode invokeVoidCallNode;
         @Child private DLLRFFI.DLSymNode dlSymNode = RFFIFactory.getDLLRFFI().createDLSymNode();
         @Child private DLLRFFI.DLOpenNode dlOpenNode = RFFIFactory.getDLLRFFI().createDLOpenNode();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java
index cd0f4118da5b656f164fd6d4fc5964f557d1d22e..ecb7e39ff27ea22968d38051ed71d123663f2e55 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java
@@ -60,7 +60,7 @@ public abstract class RFFIContext extends RFFI {
 
     /**
      * The GC in GNUR is cooperative, which means that unless native code calls back to the R engine
-     * (GNUR/FastR) it may assume (and unfortunately people do that) that GC will not run and will
+     * (GNUR/FastR) one may assume (and unfortunately people do that) that GC will not run and will
      * not collect anything that may be not reachable anymore, including the result of the last
      * up-call and including the objects popped off the PROTECT/UNPROTECT stack! Moreover, some
      * R-API functions are known to be not calling GC, therefore people may (and do) count on them
@@ -68,8 +68,7 @@ public abstract class RFFIContext extends RFFI {
      * variants and for macros like {@code INTEGER}. This behavior is required e.g. for
      * {@code C_parseRd}. We keep a list of all the objects that may not be reachable anymore, but
      * must not be collected, because no garbage collecting R-API function has been called since
-     * they became unreachable. This method clears this list so that Java GC can collect the
-     * objects.
+     * they became unreachable.
      */
     public final void registerReferenceUsedInNative(Object obj) {
         protectedNativeReferences.add(obj);
@@ -91,6 +90,11 @@ public abstract class RFFIContext extends RFFI {
         // empty by default
     }
 
+    /**
+     * @param canRunGc Causes that the list of additionally protected objects is cleared so that
+     *            Java GC can collect the objects. See
+     *            {@link RFFIContext#registerReferenceUsedInNative(Object)}.
+     */
     public void afterUpcall(boolean canRunGc) {
         if (canRunGc) {
             cooperativeGc();
diff --git a/mx.fastr/mx_copylib.py b/mx.fastr/mx_copylib.py
index cd731c99b21a0cb9a8ffab45594e685b1853416e..5cb57cac14dbbb83fb0f21609c77bbca55875140 100644
--- a/mx.fastr/mx_copylib.py
+++ b/mx.fastr/mx_copylib.py
@@ -165,7 +165,7 @@ def updatelib(args):
     def get_captured_libs():
         cap_libs = []
         for lib in os.listdir(fastr_libdir):
-            if not '.dylib' in lib:
+            if not ('.dylib' in lib) or '.dylibl' in lib:
                 # ignore non-libraries
                 continue
             if locally_built(lib) or os.path.islink(os.path.join(fastr_libdir, lib)):
@@ -177,7 +177,7 @@ def updatelib(args):
     cap_libs = get_captured_libs()
     libs = []
     for lib in os.listdir(libdir):
-        if not ('.dylib' in lib or '.so' in lib):
+        if (not ('.dylib' in lib or '.so' in lib)) or '.dylibl' in lib or '.sol' in lib:
             # ignore non-libraries
             continue
         if not os.path.islink(os.path.join(libdir, lib)):