From da58ae3509800f4b641dce0fbfc3b155e6eca002 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 31 Oct 2011 16:01:14 -0700 Subject: [PATCH 01/19] Add an LLVM git submodule --- .gitmodules | 3 +++ src/llvm | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 src/llvm diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000..8b0b1c7a3d567 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/llvm"] + path = src/llvm + url = http://llvm.org/git/llvm.git diff --git a/src/llvm b/src/llvm new file mode 160000 index 0000000000000..566f233ba64c0 --- /dev/null +++ b/src/llvm @@ -0,0 +1 @@ +Subproject commit 566f233ba64c0bb2773b5717cb18753c7564f4b7 From 1bdfb698f64e701f3a9aae0477540f225155e574 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 31 Oct 2011 16:51:15 -0700 Subject: [PATCH 02/19] Add submodule management to configure script --- configure | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/configure b/configure index ada720c120feb..d0760ab0b8ae7 100755 --- a/configure +++ b/configure @@ -425,7 +425,8 @@ for i in \ nd nd/std \ dl \ test/run-pass test/run-fail test/compile-fail \ - test/bench test/perf test/pretty + test/bench test/perf test/pretty \ + llvm/build llvm/install do make_dir $i done @@ -466,6 +467,39 @@ do done done + +# Configure submodules +step_msg "configuring submodules" + +# Have to be in the top of src directory for this +cd ${CFG_SRC_DIR} + +SUBMODULE_STATUS=$("${CFG_GIT}" submodule status) +NEED_INIT_COUNT=$(echo "$SUBMODULE_STATUS" | grep -c "^-") +NEED_UPDATE_COUNT=$(echo "$SUBMODULE_STATUS" | grep -c "^+") +NEED_INIT=$(test $NEED_INIT_COUNT -gt 0)$? +NEED_UPDATE=$(test "($NEED_INIT)" -o "$NEED_UPDATE_COUNT" -gt 0)$? + +if [ $NEED_INIT ] +then + msg "git: submodule init" + ${CFG_GIT} submodule init --quiet +fi + +if [ $NEED_UPDATE ] +then + msg "git: submodule update" + ${CFG_GIT} submodule update --quiet +fi + +cd ${CFG_BUILD_DIR} + +msg + + +# Configure llvm + + copy ${CFG_SRC_DIR}Makefile.in ./Makefile step_msg "complete" From f95958651680f13da74612aa7cafc0e398982786 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 31 Oct 2011 17:34:31 -0700 Subject: [PATCH 03/19] Add mk/llvm.mk --- Makefile.in | 1 + mk/llvm.mk | 0 2 files changed, 1 insertion(+) create mode 100644 mk/llvm.mk diff --git a/Makefile.in b/Makefile.in index a349b073f330b..ebc7d4a1f0780 100644 --- a/Makefile.in +++ b/Makefile.in @@ -335,6 +335,7 @@ include $(CFG_SRC_DIR)/mk/rustllvm.mk include $(CFG_SRC_DIR)/mk/autodep.mk include $(CFG_SRC_DIR)/mk/tools.mk include $(CFG_SRC_DIR)/mk/docs.mk +include $(CFG_SRC_DIR)/mk/llvm.mk ###################################################################### # Secondary makefiles, conditionalized for speed diff --git a/mk/llvm.mk b/mk/llvm.mk new file mode 100644 index 0000000000000..e69de29bb2d1d From 4e08d43cc3ca5a372735615440118d77dac03687 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 31 Oct 2011 18:19:40 -0700 Subject: [PATCH 04/19] Reconfigure when the git submodule status changes --- Makefile.in | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Makefile.in b/Makefile.in index ebc7d4a1f0780..477e97b71e7fa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -318,6 +318,17 @@ endif # Re-configuration ###################################################################### +# This is a pretty expensive operation but I don't see any way to avoid it +SUBMODULE_STATUS=$(shell cd "$(CFG_SRC_DIR)" && "$(CFG_GIT)" submodule status) +# Look through for submodules prefixed with '-' (need init), or '+' (need update) +NEED_GIT_RECONFIG=$(shell echo "$(SUBMODULE_STATUS)" | grep -c '^\(+\|-\)') + +ifeq ($(NEED_GIT_RECONFIG),0) +else +# If the submodules have changed then always execute config.mk +.PHONY: config.mk +endif + config.mk: $(S)configure $(S)Makefile.in $(S)src/snapshots.txt @$(call E, cfg: reconfiguring) $(Q)$(S)configure $(CFG_CONFIGURE_ARGS) From b13acf7ff4edd4744c2d64a3a80d7adf1eab1deb Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 1 Nov 2011 15:22:07 -0700 Subject: [PATCH 05/19] Call LLVM's configure script from ours --- configure | 56 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/configure b/configure index d0760ab0b8ae7..0a601cbe22861 100755 --- a/configure +++ b/configure @@ -414,19 +414,18 @@ putvar CFG_LLVM_LDFLAGS putvar CFG_LLVM_LIBS putvar CFG_LLVM_TRIPLE -# Munge any paths that appear in config.mk back to posix-y -perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \ - -e 's@\\@/@go;' config.mk -rm -f config.mk.bak +CFG_LLVM_BUILD_DIR=llvm/build +CFG_LLVM_INST_DIR=llvm/install step_msg "making directories" + for i in \ doc doc/std \ nd nd/std \ dl \ test/run-pass test/run-fail test/compile-fail \ test/bench test/perf test/pretty \ - llvm/build llvm/install + $LLVM_BUILD_DIR $LLVM_INST_DIR do make_dir $i done @@ -497,8 +496,53 @@ cd ${CFG_BUILD_DIR} msg -# Configure llvm +# Configure llvm. Here we go... +step_msg "configure: LLVM" + +CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}/src/llvm + +LLVM_TARGETS="--enable-targets=x86,x86_64" +LLVM_DISABLE="--disable-docs" + +LLVM_CXX_32="g++ -m32" +LLVM_CC_32="gcc -m32" +LLVM_CFLAGS_32="-m32" +LLVM_CXXFLAGS_32="-m32" +LLVM_LDFLAGS_32="-m32" + +# FIXME: Need to change flags for x64 +LLVM_CXX=$LLVM_CXX_32 +LLVM_CC=$LLVM_CC_32 +LLVM_CFLAGS=$LLVM_CFLAGS_32 +LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 +LLVM_LDFLAGS=$LLVM_LDFLAGS_32 +CXX=$LLVM_CXX +CC=$LLVM_CC +CFLAGS=$LLVM_CFLAGS +CXXFLAGS=$LLVM_CXXFLAGS +LDFLAGS=$LLVM_LDFLAGS + +export CXX +export CC +export CFLAGS +export CXXFLAGS +export LDFLAGS + +cd $CFG_LLVM_BUILD_DIR +# FIXME: This won't work if CFG_SRC_DIR is absolute +${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_TARGETS $LLVM_DISABLE +cd $CFG_BUILD_DIR + +putvar CFG_LLVM_SRC_DIR +putvar CFG_LLVM_BUILD_DIR +putvar CFG_LLVM_INST_DIR + + +# Munge any paths that appear in config.mk back to posix-y +perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \ + -e 's@\\@/@go;' config.mk +rm -f config.mk.bak copy ${CFG_SRC_DIR}Makefile.in ./Makefile From 191bc9433bf01b5d4374ecad19464d54e486de75 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 1 Nov 2011 15:48:30 -0700 Subject: [PATCH 06/19] Tie the LLVM build into ours --- configure | 16 ++++++++++++---- mk/llvm.mk | 5 +++++ mk/rustllvm.mk | 3 +-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 0a601cbe22861..5f84ecaff9db8 100755 --- a/configure +++ b/configure @@ -414,8 +414,8 @@ putvar CFG_LLVM_LDFLAGS putvar CFG_LLVM_LIBS putvar CFG_LLVM_TRIPLE -CFG_LLVM_BUILD_DIR=llvm/build -CFG_LLVM_INST_DIR=llvm/install +LLVM_BUILD_DIR=llvm/build +LLVM_INST_DIR=llvm/install step_msg "making directories" @@ -497,12 +497,18 @@ msg # Configure llvm. Here we go... -step_msg "configure: LLVM" +step_msg "configuring LLVM" CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}/src/llvm +CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/${LLVM_BUILD_DIR} +CFG_LLVM_INST_DIR=${CFG_BUILD_DIR}/${LLVM_INST_DIR} LLVM_TARGETS="--enable-targets=x86,x86_64" LLVM_DISABLE="--disable-docs" +LLVM_PREFIX="--prefix=${CFG_LLVM_INST_DIR}" +LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" +LLVM_HOST="--host=${CFG_HOST_TRIPLE}" +LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" LLVM_CXX_32="g++ -m32" LLVM_CC_32="gcc -m32" @@ -523,6 +529,8 @@ CFLAGS=$LLVM_CFLAGS CXXFLAGS=$LLVM_CXXFLAGS LDFLAGS=$LLVM_LDFLAGS +LLVM_FLAGS="$LLVM_TARGETS $LLVM_DISABLE $LLVM_PREFIX $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" + export CXX export CC export CFLAGS @@ -531,7 +539,7 @@ export LDFLAGS cd $CFG_LLVM_BUILD_DIR # FIXME: This won't work if CFG_SRC_DIR is absolute -${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_TARGETS $LLVM_DISABLE +${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS cd $CFG_BUILD_DIR putvar CFG_LLVM_SRC_DIR diff --git a/mk/llvm.mk b/mk/llvm.mk index e69de29bb2d1d..06ce64b8bc780 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -0,0 +1,5 @@ +.PHONY: $(CFG_LLVM_INST_DIR)/bin/llc + +$(CFG_LLVM_INST_DIR)/bin/llc: + @$(call E, make: llvm) + $(Q)make install -C $(CFG_LLVM_BUILD_DIR) \ No newline at end of file diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index e5d30d5487b39..b33b784e48901 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -26,10 +26,9 @@ rustllvm/$(1)/$(CFG_RUSTLLVM): $$(RUSTLLVM_OBJS_OBJS_$(1)) \ $$(CFG_GCCISH_POST_LIB_FLAGS) \ $$(CFG_LLVM_LDFLAGS),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) -rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) +rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(CFG_LLVM_INST_DIR)/bin/llc @$$(call E, compile: $$@) $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(CFG_LLVM_CXXFLAGS) $$(RUSTLLVM_INCS_$(1))) $$< - endef # Instantiate template for all stages From f09af1fea2ab4c4657e1e4b1015478d258fee992 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 1 Nov 2011 16:12:19 -0700 Subject: [PATCH 07/19] Use LLVM directly from the build directory This will cut out the few seconds it takes to run make install. --- configure | 14 +++++--------- mk/llvm.mk | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 5f84ecaff9db8..00e7929d5767f 100755 --- a/configure +++ b/configure @@ -414,9 +414,6 @@ putvar CFG_LLVM_LDFLAGS putvar CFG_LLVM_LIBS putvar CFG_LLVM_TRIPLE -LLVM_BUILD_DIR=llvm/build -LLVM_INST_DIR=llvm/install - step_msg "making directories" for i in \ @@ -425,7 +422,7 @@ for i in \ dl \ test/run-pass test/run-fail test/compile-fail \ test/bench test/perf test/pretty \ - $LLVM_BUILD_DIR $LLVM_INST_DIR + llvm do make_dir $i done @@ -499,13 +496,12 @@ msg # Configure llvm. Here we go... step_msg "configuring LLVM" -CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}/src/llvm -CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/${LLVM_BUILD_DIR} -CFG_LLVM_INST_DIR=${CFG_BUILD_DIR}/${LLVM_INST_DIR} +CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm +CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/llvm +CFG_LLVM_INST_DIR=${CFG_LLVM_BUILD_DIR}/Release+Asserts LLVM_TARGETS="--enable-targets=x86,x86_64" LLVM_DISABLE="--disable-docs" -LLVM_PREFIX="--prefix=${CFG_LLVM_INST_DIR}" LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" LLVM_HOST="--host=${CFG_HOST_TRIPLE}" LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" @@ -529,7 +525,7 @@ CFLAGS=$LLVM_CFLAGS CXXFLAGS=$LLVM_CXXFLAGS LDFLAGS=$LLVM_LDFLAGS -LLVM_FLAGS="$LLVM_TARGETS $LLVM_DISABLE $LLVM_PREFIX $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" +LLVM_FLAGS="$LLVM_TARGETS $LLVM_DISABLE $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" export CXX export CC diff --git a/mk/llvm.mk b/mk/llvm.mk index 06ce64b8bc780..2743c289d4872 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -2,4 +2,4 @@ $(CFG_LLVM_INST_DIR)/bin/llc: @$(call E, make: llvm) - $(Q)make install -C $(CFG_LLVM_BUILD_DIR) \ No newline at end of file + $(Q)make -C $(CFG_LLVM_BUILD_DIR) \ No newline at end of file From fed44acb407b71bafedbb6bf5bcab90ba1ce10c2 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 1 Nov 2011 17:09:44 -0700 Subject: [PATCH 08/19] LLVM build cleanup --- Makefile.in | 23 +++++++++++++++++------ configure | 8 ++++++-- mk/autodep.mk | 4 ++-- mk/llvm.mk | 6 ++++-- mk/platform.mk | 1 - mk/rustllvm.mk | 11 ++++++----- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/Makefile.in b/Makefile.in index 477e97b71e7fa..7e84f9a49f91c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -62,8 +62,6 @@ CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS)) endif CFG_INFO := $(info cfg: shell host triple $(CFG_HOST_TRIPLE)) -CFG_INFO := $(info cfg: llvm host triple $(CFG_LLVM_TRIPLE)) -CFG_INFO := $(info cfg: llvm target triples $(CFG_TARGET_TRIPLES)) ifdef CFG_DISABLE_OPTIMIZE $(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE)) @@ -194,6 +192,23 @@ COMPILER_CRATE := $(S)src/comp/rustc.rc COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \ rustc.rc *.rs */*.rs */*/*.rs)) +###################################################################### +# LLVM macros +###################################################################### + +LLVM_CONFIG:=$(CFG_LLVM_INST_DIR)/bin/llvm-config +LLVM_VERSION=$(shell "$(LLVM_CONFIG)" --version) +LLVM_BINDIR=$(shell "$(LLVM_CONFIG)" --bindir) +LLVM_INCDIR=$(shell "$(LLVM_CONFIG)" --includedir) +LLVM_LIBDIR=$(shell "$(LLVM_CONFIG)" --libdir) +LLVM_LIBS=$(shell "$(LLVM_CONFIG)" --libs) +LLVM_LDFLAGS=$(shell "$(LLVM_CONFIG)" --ldflags) +LLVM_CXXFLAGS=$(shell "$(LLVM_CONFIG)" --cxxflags) +LLVM_HOST_TRIPLE=$(shell "$(LLVM_CONFIG)" --host-target) + +LLVM_AS=$(CFG_LLVM_BINDIR)/llvm-as$(X) +LLC=$(CFG_LLVM_BINDIR)/llc$(X) + ###################################################################### # Exports for sub-utilities ###################################################################### @@ -213,10 +228,6 @@ export CFG_PREFIX # Subprograms ###################################################################### -LLVM_AS := $(CFG_LLVM_BINDIR)/llvm-as$(X) - -LLC := $(CFG_LLVM_BINDIR)/llc$(X) - ###################################################################### # Per-stage targets and runner ###################################################################### diff --git a/configure b/configure index 00e7929d5767f..3a5017a59c7f8 100755 --- a/configure +++ b/configure @@ -498,13 +498,14 @@ step_msg "configuring LLVM" CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/llvm +# Just use LLVM straight from its build directory to avoid 'make install' time CFG_LLVM_INST_DIR=${CFG_LLVM_BUILD_DIR}/Release+Asserts LLVM_TARGETS="--enable-targets=x86,x86_64" -LLVM_DISABLE="--disable-docs" LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" LLVM_HOST="--host=${CFG_HOST_TRIPLE}" LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" +LLVM_OPTS="--enable-optimized --disable-docs" LLVM_CXX_32="g++ -m32" LLVM_CC_32="gcc -m32" @@ -525,7 +526,10 @@ CFLAGS=$LLVM_CFLAGS CXXFLAGS=$LLVM_CXXFLAGS LDFLAGS=$LLVM_LDFLAGS -LLVM_FLAGS="$LLVM_TARGETS $LLVM_DISABLE $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" +LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" + +msg "configuring LLVM with:" +msg "$LLVM_FLAGS" export CXX export CC diff --git a/mk/autodep.mk b/mk/autodep.mk index 1eacbac1652e4..04d7a5c77e6bd 100644 --- a/mk/autodep.mk +++ b/mk/autodep.mk @@ -14,11 +14,11 @@ rt/%.d: rt/%.cpp $(MKFILES) $(Q)rm -f $@.tmp.bak $(Q)mv $@.tmp $@ -rustllvm/%.d: rustllvm/%.cpp $(MKFILES) +rustllvm/%.d: rustllvm/%.cpp $(MKFILES) $(LLVM_CONFIG) @$(call E, dep: $@) $(Q)$(call CFG_DEPEND_C, $@ \ $(subst $(S)src/,,$(patsubst %.cpp, %.o, $<)), \ - $(CFG_LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $< >$@.tmp + $(LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $< >$@.tmp $(Q)$(CFG_PATH_MUNGE) $@.tmp $(Q)rm -f $@.tmp.bak $(Q)mv $@.tmp $@ diff --git a/mk/llvm.mk b/mk/llvm.mk index 2743c289d4872..d807565e384a0 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -1,5 +1,7 @@ -.PHONY: $(CFG_LLVM_INST_DIR)/bin/llc +# This is just a rough approximation of LLVM deps +LLVM_DEPS:=$(wildcard $(addprefix $(CFG_LLVM_SRC_DIR)/, \ + * */*h */*/*h */*/*/*h */*cpp */*/*cpp */*/*/*cpp)) -$(CFG_LLVM_INST_DIR)/bin/llc: +$(LLVM_CONFIG): $(LLVM_DEPS) @$(call E, make: llvm) $(Q)make -C $(CFG_LLVM_BUILD_DIR) \ No newline at end of file diff --git a/mk/platform.mk b/mk/platform.mk index 21f515c2c6de3..f712e043cd414 100644 --- a/mk/platform.mk +++ b/mk/platform.mk @@ -154,7 +154,6 @@ ifdef CFG_WINDOWSY CFG_EXE_SUFFIX := .exe CFG_LIB_NAME=$(1).dll CFG_DEF_SUFFIX := .def - CFG_LDPATH :=$(CFG_LLVM_BINDIR) CFG_LDPATH :=$(CFG_LDPATH):$$PATH CFG_RUN=PATH="$(CFG_LDPATH):$(1)" $(2) CFG_RUN_TARG=$(call CFG_RUN,$(HOST_LIB$(1)),$(2)) diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index b33b784e48901..4b16bff7d305f 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -14,7 +14,7 @@ endif RUSTLLVM_DEF_$(1) := rustllvm/rustllvm$$(CFG_DEF_SUFFIX) -RUSTLLVM_INCS_$(1) := -iquote $$(CFG_LLVM_INCDIR) \ +RUSTLLVM_INCS_$(1) := -iquote $$(LLVM_INCDIR) \ -iquote $$(S)src/rustllvm/include RUSTLLVM_OBJS_OBJS_$(1) := $$(RUSTLLVM_OBJS_CS_$(1):rustllvm/%.cpp=rustllvm/$(1)/%.o) @@ -22,13 +22,14 @@ rustllvm/$(1)/$(CFG_RUSTLLVM): $$(RUSTLLVM_OBJS_OBJS_$(1)) \ $$(MKFILES) $$(RUSTLLVM_DEF_$(1)) @$$(call E, link: $$@) $$(Q)$$(call CFG_LINK_C_$(1),$$@,$$(RUSTLLVM_OBJS_OBJS_$(1)) \ - $$(CFG_GCCISH_PRE_LIB_FLAGS) $$(CFG_LLVM_LIBS) \ + $$(CFG_GCCISH_PRE_LIB_FLAGS) $$(LLVM_LIBS) \ $$(CFG_GCCISH_POST_LIB_FLAGS) \ - $$(CFG_LLVM_LDFLAGS),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) + $$(LLVM_LDFLAGS),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) -rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(CFG_LLVM_INST_DIR)/bin/llc +rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) \ + $$(CFG_LLVM_INST_DIR)/bin/llvm-config @$$(call E, compile: $$@) - $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(CFG_LLVM_CXXFLAGS) $$(RUSTLLVM_INCS_$(1))) $$< + $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(LLVM_CXXFLAGS) $$(RUSTLLVM_INCS_$(1))) $$< endef # Instantiate template for all stages From d91ed3e1368a088ba94780947184ed41e2ed02c0 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 2 Nov 2011 14:07:32 -0700 Subject: [PATCH 09/19] Begin remove old LLVM configuration code --- configure | 166 ++++++++++++++++++++---------------------------------- 1 file changed, 61 insertions(+), 105 deletions(-) diff --git a/configure b/configure index 3a5017a59c7f8..ebdea8c89bef6 100755 --- a/configure +++ b/configure @@ -306,51 +306,21 @@ fi if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ] then - CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config" -fi - -if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ] -then - CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include" - CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin" - CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib" - CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR" - CFG_LLVM_LDFLAGS="" - CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \ - -name '*.lib' \ - -exec echo '\"{}\"' ';' \ - | xargs echo) - CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \ - --version \ - | grep version \ - | cut -d ' ' -f 5-) - CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \ - --version \ - | grep Host: \ - | cut -d ' ' -f 4-) -elif [ ! -z "$CFG_LLVM_CONFIG" ] -then - CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version) - CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir) - CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir) - CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir) - CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags) - CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags) - CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs) - CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target) -else - err "no llvm-config found and no --llvm-root specified" + step_msg "using custom LLVM" + + LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config" + LLVM_VERSION=$($CFG_LLVM_CONFIG --version) + + case $LLVM_VERSION in + (3.0svn | 3.0 | 3.1svn) + step_msg "found ok version of LLVM: $CFG_LLVM_VERSION" + ;; + (*) + err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn" + ;; + esac fi -case $CFG_LLVM_VERSION in - (3.0svn | 3.0 | 3.1svn) - step_msg "found ok version of LLVM: $CFG_LLVM_VERSION" - ;; - (*) - err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn" - ;; -esac - if [ ! -z "$CFG_ENABLE_CLANG" ] then if [ -z "$CFG_CLANG" ] @@ -381,18 +351,6 @@ then CFG_PREFIX=/usr/local fi -if [ ! -z "$CFG_LLVM_TRIPLE" ] -then - if [ $CFG_HOST_TRIPLE != $CFG_LLVM_TRIPLE ] - then - warn "LLVM host-triple $CFG_LLVM_TRIPLE differs from" - warn "detected host triple $CFG_HOST_TRIPLE" - warn "choosing LLVM host-triple instead" - msg "" - CFG_HOST_TRIPLE=$CFG_LLVM_TRIPLE - fi -fi - if [ -z "$CFG_TARGET_TRIPLES" ] then CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}" @@ -405,14 +363,6 @@ putvar CFG_C_COMPILER putvar CFG_PREFIX putvar CFG_LLVM_ROOT -putvar CFG_LLVM_CONFIG -putvar CFG_LLVM_INCDIR -putvar CFG_LLVM_BINDIR -putvar CFG_LLVM_LIBDIR -putvar CFG_LLVM_CXXFLAGS -putvar CFG_LLVM_LDFLAGS -putvar CFG_LLVM_LIBS -putvar CFG_LLVM_TRIPLE step_msg "making directories" @@ -494,53 +444,59 @@ msg # Configure llvm. Here we go... -step_msg "configuring LLVM" - CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/llvm # Just use LLVM straight from its build directory to avoid 'make install' time CFG_LLVM_INST_DIR=${CFG_LLVM_BUILD_DIR}/Release+Asserts -LLVM_TARGETS="--enable-targets=x86,x86_64" -LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" -LLVM_HOST="--host=${CFG_HOST_TRIPLE}" -LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" -LLVM_OPTS="--enable-optimized --disable-docs" - -LLVM_CXX_32="g++ -m32" -LLVM_CC_32="gcc -m32" -LLVM_CFLAGS_32="-m32" -LLVM_CXXFLAGS_32="-m32" -LLVM_LDFLAGS_32="-m32" - -# FIXME: Need to change flags for x64 -LLVM_CXX=$LLVM_CXX_32 -LLVM_CC=$LLVM_CC_32 -LLVM_CFLAGS=$LLVM_CFLAGS_32 -LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 -LLVM_LDFLAGS=$LLVM_LDFLAGS_32 - -CXX=$LLVM_CXX -CC=$LLVM_CC -CFLAGS=$LLVM_CFLAGS -CXXFLAGS=$LLVM_CXXFLAGS -LDFLAGS=$LLVM_LDFLAGS - -LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" - -msg "configuring LLVM with:" -msg "$LLVM_FLAGS" - -export CXX -export CC -export CFLAGS -export CXXFLAGS -export LDFLAGS - -cd $CFG_LLVM_BUILD_DIR -# FIXME: This won't work if CFG_SRC_DIR is absolute -${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS -cd $CFG_BUILD_DIR +if [ -z $CFG_LLVM_ROOT ] +then + step_msg "configuring LLVM" + + LLVM_TARGETS="--enable-targets=x86,x86_64" + LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" + LLVM_HOST="--host=${CFG_HOST_TRIPLE}" + LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" + LLVM_OPTS="--enable-optimized --disable-docs" + + LLVM_CXX_32="g++ -m32" + LLVM_CC_32="gcc -m32" + LLVM_CFLAGS_32="-m32" + LLVM_CXXFLAGS_32="-m32" + LLVM_LDFLAGS_32="-m32" + + # FIXME: Need to change flags for x64 + LLVM_CXX=$LLVM_CXX_32 + LLVM_CC=$LLVM_CC_32 + LLVM_CFLAGS=$LLVM_CFLAGS_32 + LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 + LLVM_LDFLAGS=$LLVM_LDFLAGS_32 + + CXX=$LLVM_CXX + CC=$LLVM_CC + CFLAGS=$LLVM_CFLAGS + CXXFLAGS=$LLVM_CXXFLAGS + LDFLAGS=$LLVM_LDFLAGS + + LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" + + msg "configuring LLVM with:" + msg "$LLVM_FLAGS" + + export CXX + export CC + export CFLAGS + export CXXFLAGS + export LDFLAGS + + cd $CFG_LLVM_BUILD_DIR + # FIXME: This won't work if CFG_SRC_DIR is absolute + ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS + cd $CFG_BUILD_DIR +else + # The user is using their own LLVM + CFG_LLVM_INST_DIR=$CFG_LLVM_ROOT +fi putvar CFG_LLVM_SRC_DIR putvar CFG_LLVM_BUILD_DIR From c0450da79f10b66cb00b8e4ea64ba25cde6f8a1c Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 2 Nov 2011 15:10:19 -0700 Subject: [PATCH 10/19] Cleanup LLVM build rules after rebase onto x64 changes --- Makefile.in | 5 +++-- configure | 13 +++++++------ mk/platform.mk | 2 +- mk/rustllvm.mk | 3 +-- mk/target.mk | 3 ++- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Makefile.in b/Makefile.in index 7e84f9a49f91c..564fd5ab0baa0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -196,6 +196,7 @@ COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \ # LLVM macros ###################################################################### +# Any rules that depend on LLVM should depend on LLVM_CONFIG LLVM_CONFIG:=$(CFG_LLVM_INST_DIR)/bin/llvm-config LLVM_VERSION=$(shell "$(LLVM_CONFIG)" --version) LLVM_BINDIR=$(shell "$(LLVM_CONFIG)" --bindir) @@ -206,8 +207,8 @@ LLVM_LDFLAGS=$(shell "$(LLVM_CONFIG)" --ldflags) LLVM_CXXFLAGS=$(shell "$(LLVM_CONFIG)" --cxxflags) LLVM_HOST_TRIPLE=$(shell "$(LLVM_CONFIG)" --host-target) -LLVM_AS=$(CFG_LLVM_BINDIR)/llvm-as$(X) -LLC=$(CFG_LLVM_BINDIR)/llc$(X) +LLVM_AS=$(LLVM_BINDIR)/llvm-as$(X) +LLC=$(LLVM_BINDIR)/llc$(X) ###################################################################### # Exports for sub-utilities diff --git a/configure b/configure index ebdea8c89bef6..c0625cf86013b 100755 --- a/configure +++ b/configure @@ -204,7 +204,7 @@ esac case $CFG_CPUTYPE in i386 | i486 | i686 | i786 | x86) - CFG_CPUTYPE=i686 + CFG_CPUTYPE=i386 ;; xscale | arm) @@ -212,7 +212,8 @@ case $CFG_CPUTYPE in ;; x86_64 | x86-64 | x64) - CFG_CPUTYPE=x86_64 + # FIME: Once we do a 64-bit build this should be x86_64 + CFG_CPUTYPE=i386 ;; *) @@ -306,17 +307,17 @@ fi if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ] then - step_msg "using custom LLVM" + step_msg "using custom LLVM at $CFG_LLVM_ROOT" LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config" - LLVM_VERSION=$($CFG_LLVM_CONFIG --version) + LLVM_VERSION=$($LLVM_CONFIG --version) case $LLVM_VERSION in (3.0svn | 3.0 | 3.1svn) - step_msg "found ok version of LLVM: $CFG_LLVM_VERSION" + step_msg "found ok version of LLVM: $LLVM_VERSION" ;; (*) - err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn" + err "bad LLVM version: $LLVM_VERSION, need >=3.0svn" ;; esac fi diff --git a/mk/platform.mk b/mk/platform.mk index f712e043cd414..f1dfd824e1e08 100644 --- a/mk/platform.mk +++ b/mk/platform.mk @@ -39,7 +39,7 @@ endif ifneq ($(findstring linux,$(CFG_OSTYPE)),) CFG_LIB_NAME=lib$(1).so - CFG_GCCISH_CFLAGS += -fPIC -march=i686 + CFG_GCCISH_CFLAGS += -fPIC CFG_GCCISH_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt CFG_GCCISH_DEF_FLAG := -Wl,--export-dynamic,--dynamic-list= CFG_GCCISH_PRE_LIB_FLAGS := -Wl,-whole-archive diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index 4b16bff7d305f..0ed9c55e69416 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -26,8 +26,7 @@ rustllvm/$(1)/$(CFG_RUSTLLVM): $$(RUSTLLVM_OBJS_OBJS_$(1)) \ $$(CFG_GCCISH_POST_LIB_FLAGS) \ $$(LLVM_LDFLAGS),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) -rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) \ - $$(CFG_LLVM_INST_DIR)/bin/llvm-config +rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(LLVM_CONFIG) @$$(call E, compile: $$@) $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(LLVM_CXXFLAGS) $$(RUSTLLVM_INCS_$(1))) $$< endef diff --git a/mk/target.mk b/mk/target.mk index af31a937ec04b..ad6b8cc31dbc5 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -12,7 +12,8 @@ $$(TARGET_LIB$(1)$(2))/intrinsics.ll: \ @$$(call E, sed: $$@) $$(Q)sed s/@CFG_TARGET_TRIPLE@/$(2)/ $$< > $$@ -$$(TARGET_LIB$(1)$(2))/intrinsics.bc: $$(TARGET_LIB$(1)$(2))/intrinsics.ll +$$(TARGET_LIB$(1)$(2))/intrinsics.bc: $$(TARGET_LIB$(1)$(2))/intrinsics.ll \ + $$(LLVM_CONFIG) @$$(call E, llvms-as: $$@) $$(Q)$$(LLVM_AS) -o $$@ $$< From 6954d4e6c5ea600a5f084ee3459f1358cd818a8f Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 2 Nov 2011 16:21:17 -0700 Subject: [PATCH 11/19] Parameterize the LLVM build over the target triples --- Makefile.in | 36 ++++++++----- configure | 133 ++++++++++++++++++++++++++++--------------------- mk/autodep.mk | 4 +- mk/llvm.mk | 18 +++++-- mk/rustllvm.mk | 12 ++--- mk/target.mk | 4 +- 6 files changed, 126 insertions(+), 81 deletions(-) diff --git a/Makefile.in b/Makefile.in index 564fd5ab0baa0..7c7659e607bd9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -196,19 +196,31 @@ COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \ # LLVM macros ###################################################################### +define DEF_LLVM_VARS +# The configure script defines these variables with the target triples +# separated by Z. This defines new ones with the expected format. +CFG_LLVM_BUILD_DIR_$(1):=$$(CFG_LLVM_BUILD_DIR_$(subst -,_,$(1))) +CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_INST_DIR_$(subst -,_,$(1))) + # Any rules that depend on LLVM should depend on LLVM_CONFIG -LLVM_CONFIG:=$(CFG_LLVM_INST_DIR)/bin/llvm-config -LLVM_VERSION=$(shell "$(LLVM_CONFIG)" --version) -LLVM_BINDIR=$(shell "$(LLVM_CONFIG)" --bindir) -LLVM_INCDIR=$(shell "$(LLVM_CONFIG)" --includedir) -LLVM_LIBDIR=$(shell "$(LLVM_CONFIG)" --libdir) -LLVM_LIBS=$(shell "$(LLVM_CONFIG)" --libs) -LLVM_LDFLAGS=$(shell "$(LLVM_CONFIG)" --ldflags) -LLVM_CXXFLAGS=$(shell "$(LLVM_CONFIG)" --cxxflags) -LLVM_HOST_TRIPLE=$(shell "$(LLVM_CONFIG)" --host-target) - -LLVM_AS=$(LLVM_BINDIR)/llvm-as$(X) -LLC=$(LLVM_BINDIR)/llc$(X) +LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config +LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version) +LLVM_BINDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --bindir) +LLVM_INCDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --includedir) +LLVM_LIBDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libdir) +LLVM_LIBS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libs) +LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags) +LLVM_CXXFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags) +LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target) + +LLVM_AS_$(1)=$$(LLVM_BINDIR_$(1))/llvm-as$$(X) +LLC_$(1)=$$(LLVM_BINDIR_$(1))/llc$$(X) + +endef + +$(foreach target,$(CFG_TARGET_TRIPLES), \ + $(eval $(call DEF_LLVM_VARS,$(target)))) + ###################################################################### # Exports for sub-utilities diff --git a/configure b/configure index c0625cf86013b..7aad41ad126a1 100755 --- a/configure +++ b/configure @@ -372,12 +372,17 @@ for i in \ nd nd/std \ dl \ test/run-pass test/run-fail test/compile-fail \ - test/bench test/perf test/pretty \ - llvm + test/bench test/perf test/pretty do make_dir $i done +make_dir llvm +for t in $CFG_TARGET_TRIPLES +do + make_dir llvm/$t +done + make_dir rustllvm for t in $CFG_TARGET_TRIPLES do @@ -446,62 +451,78 @@ msg # Configure llvm. Here we go... CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm -CFG_LLVM_BUILD_DIR=${CFG_BUILD_DIR}/llvm -# Just use LLVM straight from its build directory to avoid 'make install' time -CFG_LLVM_INST_DIR=${CFG_LLVM_BUILD_DIR}/Release+Asserts +putvar CFG_LLVM_SRC_DIR -if [ -z $CFG_LLVM_ROOT ] -then - step_msg "configuring LLVM" - - LLVM_TARGETS="--enable-targets=x86,x86_64" - LLVM_BUILD="--build=${CFG_HOST_TRIPLE}" - LLVM_HOST="--host=${CFG_HOST_TRIPLE}" - LLVM_TARGET="--target=${CFG_HOST_TRIPLE}" - LLVM_OPTS="--enable-optimized --disable-docs" - - LLVM_CXX_32="g++ -m32" - LLVM_CC_32="gcc -m32" - LLVM_CFLAGS_32="-m32" - LLVM_CXXFLAGS_32="-m32" - LLVM_LDFLAGS_32="-m32" - - # FIXME: Need to change flags for x64 - LLVM_CXX=$LLVM_CXX_32 - LLVM_CC=$LLVM_CC_32 - LLVM_CFLAGS=$LLVM_CFLAGS_32 - LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 - LLVM_LDFLAGS=$LLVM_LDFLAGS_32 - - CXX=$LLVM_CXX - CC=$LLVM_CC - CFLAGS=$LLVM_CFLAGS - CXXFLAGS=$LLVM_CXXFLAGS - LDFLAGS=$LLVM_LDFLAGS - - LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" - - msg "configuring LLVM with:" - msg "$LLVM_FLAGS" - - export CXX - export CC - export CFLAGS - export CXXFLAGS - export LDFLAGS - - cd $CFG_LLVM_BUILD_DIR - # FIXME: This won't work if CFG_SRC_DIR is absolute - ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS - cd $CFG_BUILD_DIR -else - # The user is using their own LLVM - CFG_LLVM_INST_DIR=$CFG_LLVM_ROOT -fi +for t in $CFG_TARGET_TRIPLES +do + if [ -z $CFG_LLVM_ROOT ] + then + step_msg "configuring LLVM for $t" + + LLVM_BUILD_DIR=$CFG_BUILD_DIR/llvm/$t + # Just use LLVM straight from its build directory to + # avoid 'make install' time + LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts + + LLVM_TARGETS="--enable-targets=x86,x86_64" + LLVM_BUILD="--build=$t" + LLVM_HOST="--host=$t" + LLVM_TARGET="--target=$t" + LLVM_OPTS="--enable-optimized --disable-docs" + + LLVM_CXX_32="g++ -m32" + LLVM_CC_32="gcc -m32" + LLVM_CFLAGS_32="-m32" + LLVM_CXXFLAGS_32="-m32" + LLVM_LDFLAGS_32="-m32" + + # FIXME: Need to change flags for x64 + LLVM_CXX=$LLVM_CXX_32 + LLVM_CC=$LLVM_CC_32 + LLVM_CFLAGS=$LLVM_CFLAGS_32 + LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32 + LLVM_LDFLAGS=$LLVM_LDFLAGS_32 + + CXX=$LLVM_CXX + CC=$LLVM_CC + CFLAGS=$LLVM_CFLAGS + CXXFLAGS=$LLVM_CXXFLAGS + LDFLAGS=$LLVM_LDFLAGS + + LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET" + + msg "configuring LLVM with:" + msg "$LLVM_FLAGS" + + export CXX + export CC + export CFLAGS + export CXXFLAGS + export LDFLAGS + + cd $LLVM_BUILD_DIR + # FIXME: This won't work if CFG_SRC_DIR is absolute + ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS + cd $CFG_BUILD_DIR + else + LLVM_BUILD_DIR=bogus + # The user is using their own LLVM + LLVM_INST_DIR=$CFG_LLVM_ROOT + fi -putvar CFG_LLVM_SRC_DIR -putvar CFG_LLVM_BUILD_DIR -putvar CFG_LLVM_INST_DIR + # Construct variables for LLVM build and install directories for + # each target. These will be named + # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in + # target_triple will be converted to underscore, because bash + # variables can't contain hyphens. The makefile will then have to + # convert back. + CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _) + CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _) + eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'" + eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'" + putvar $CFG_LLVM_BUILD_DIR + putvar $CFG_LLVM_INST_DIR +done # Munge any paths that appear in config.mk back to posix-y diff --git a/mk/autodep.mk b/mk/autodep.mk index 04d7a5c77e6bd..dc46b540ead38 100644 --- a/mk/autodep.mk +++ b/mk/autodep.mk @@ -14,11 +14,11 @@ rt/%.d: rt/%.cpp $(MKFILES) $(Q)rm -f $@.tmp.bak $(Q)mv $@.tmp $@ -rustllvm/%.d: rustllvm/%.cpp $(MKFILES) $(LLVM_CONFIG) +rustllvm/%.d: rustllvm/%.cpp $(MKFILES) $(LLVM_CONFIG_$(CFG_HOST_TRIPLE)) @$(call E, dep: $@) $(Q)$(call CFG_DEPEND_C, $@ \ $(subst $(S)src/,,$(patsubst %.cpp, %.o, $<)), \ - $(LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $< >$@.tmp + $(LLVM_CXXFLAGS_$(CFG_HOST_TRIPLE)) $(RUSTLLVM_INCS)) $< >$@.tmp $(Q)$(CFG_PATH_MUNGE) $@.tmp $(Q)rm -f $@.tmp.bak $(Q)mv $@.tmp $@ diff --git a/mk/llvm.mk b/mk/llvm.mk index d807565e384a0..bd4e2ebe5a3d0 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -2,6 +2,18 @@ LLVM_DEPS:=$(wildcard $(addprefix $(CFG_LLVM_SRC_DIR)/, \ * */*h */*/*h */*/*/*h */*cpp */*/*cpp */*/*/*cpp)) -$(LLVM_CONFIG): $(LLVM_DEPS) - @$(call E, make: llvm) - $(Q)make -C $(CFG_LLVM_BUILD_DIR) \ No newline at end of file +define DEF_LLVM_RULES + +# If CFG_LLVM_ROOT is defined then we don't build LLVM ourselves +ifeq ($(CFG_LLVM_ROOT),) + +$$(LLVM_CONFIG_$(1)): $$(LLVM_DEPS_$(1)) + @$$(call E, make: llvm) + $$(Q)make -C $$(CFG_LLVM_BUILD_DIR_$(1)) + +endif + +endef + +$(foreach target,$(CFG_TARGET_TRIPLES), \ + $(eval $(call DEF_LLVM_RULES,$(target)))) \ No newline at end of file diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index 0ed9c55e69416..068c73400f5d3 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -14,21 +14,21 @@ endif RUSTLLVM_DEF_$(1) := rustllvm/rustllvm$$(CFG_DEF_SUFFIX) -RUSTLLVM_INCS_$(1) := -iquote $$(LLVM_INCDIR) \ - -iquote $$(S)src/rustllvm/include +RUSTLLVM_INCS_$(1) = -iquote $$(LLVM_INCDIR_$(1)) \ + -iquote $$(S)src/rustllvm/include RUSTLLVM_OBJS_OBJS_$(1) := $$(RUSTLLVM_OBJS_CS_$(1):rustllvm/%.cpp=rustllvm/$(1)/%.o) rustllvm/$(1)/$(CFG_RUSTLLVM): $$(RUSTLLVM_OBJS_OBJS_$(1)) \ $$(MKFILES) $$(RUSTLLVM_DEF_$(1)) @$$(call E, link: $$@) $$(Q)$$(call CFG_LINK_C_$(1),$$@,$$(RUSTLLVM_OBJS_OBJS_$(1)) \ - $$(CFG_GCCISH_PRE_LIB_FLAGS) $$(LLVM_LIBS) \ + $$(CFG_GCCISH_PRE_LIB_FLAGS) $$(LLVM_LIBS_$(1)) \ $$(CFG_GCCISH_POST_LIB_FLAGS) \ - $$(LLVM_LDFLAGS),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) + $$(LLVM_LDFLAGS_$(1)),$$(RUSTLLVM_DEF_$(1)),$$(CFG_RUSTLLVM)) -rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(LLVM_CONFIG) +rustllvm/$(1)/%.o: rustllvm/%.cpp $$(MKFILES) $$(LLVM_CONFIG_$(1)) @$$(call E, compile: $$@) - $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(LLVM_CXXFLAGS) $$(RUSTLLVM_INCS_$(1))) $$< + $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(LLVM_CXXFLAGS_$(1)) $$(RUSTLLVM_INCS_$(1))) $$< endef # Instantiate template for all stages diff --git a/mk/target.mk b/mk/target.mk index ad6b8cc31dbc5..b2c87d9b7e8db 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -13,9 +13,9 @@ $$(TARGET_LIB$(1)$(2))/intrinsics.ll: \ $$(Q)sed s/@CFG_TARGET_TRIPLE@/$(2)/ $$< > $$@ $$(TARGET_LIB$(1)$(2))/intrinsics.bc: $$(TARGET_LIB$(1)$(2))/intrinsics.ll \ - $$(LLVM_CONFIG) + $$(LLVM_CONFIG_$(2)) @$$(call E, llvms-as: $$@) - $$(Q)$$(LLVM_AS) -o $$@ $$< + $$(Q)$$(LLVM_AS_$(2)) -o $$@ $$< $$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB): \ $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \ From 6a0db5ae1eacabf0f7766dd250917ee576a236ec Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 12:17:37 -0700 Subject: [PATCH 12/19] Use $(MAKE) for recursive make --- mk/llvm.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/llvm.mk b/mk/llvm.mk index bd4e2ebe5a3d0..104fcb01f78e6 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -9,7 +9,7 @@ ifeq ($(CFG_LLVM_ROOT),) $$(LLVM_CONFIG_$(1)): $$(LLVM_DEPS_$(1)) @$$(call E, make: llvm) - $$(Q)make -C $$(CFG_LLVM_BUILD_DIR_$(1)) + $$(Q)$$(MAKE) -C $$(CFG_LLVM_BUILD_DIR_$(1)) endif From 80452a917a96f5290dd75f89cf3defccd4d5c8a4 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 13:49:00 -0700 Subject: [PATCH 13/19] configure: Use i686 as the CPU type instead of i386 Seems to prevent the warning about linking bitcode with different triples. --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 7aad41ad126a1..5052c15578bfc 100755 --- a/configure +++ b/configure @@ -204,7 +204,7 @@ esac case $CFG_CPUTYPE in i386 | i486 | i686 | i786 | x86) - CFG_CPUTYPE=i386 + CFG_CPUTYPE=i686 ;; xscale | arm) @@ -213,7 +213,7 @@ case $CFG_CPUTYPE in x86_64 | x86-64 | x64) # FIME: Once we do a 64-bit build this should be x86_64 - CFG_CPUTYPE=i386 + CFG_CPUTYPE=i686 ;; *) From 927332853d36950c9205ba68f2a038003648d95b Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 14:13:22 -0700 Subject: [PATCH 14/19] Cleanup configure script --- configure | 81 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/configure b/configure index 5052c15578bfc..ec530440e34d2 100755 --- a/configure +++ b/configure @@ -145,6 +145,7 @@ opt() { fi } + msg "looking for configure programs" need_cmd mkdir need_cmd printf @@ -158,6 +159,7 @@ need_cmd date need_cmd tr need_cmd sed + msg "inspecting environment" CFG_OSTYPE=$(uname -s) @@ -261,14 +263,9 @@ then exit 0 fi -step_msg "writing out basic parameters" -putvar CFG_SRC_DIR -putvar CFG_BUILD_DIR -putvar CFG_OSTYPE -putvar CFG_CPUTYPE -putvar CFG_CONFIGURE_ARGS step_msg "looking for build programs" + probe_need CFG_PERL perl probe_need CFG_PYTHON python probe_need CFG_CURL curl @@ -290,21 +287,6 @@ then err "either clang or gcc is required" fi -if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T' -then - CFG_IN_TRANSITION=1 - putvar CFG_IN_TRANSITION -fi - -# Valgrind is only reliable on Linux. On Windows it doesn't work at all, and -# on the Mac the dynamic linker causes Valgrind to emit a huge stream of -# errors. -if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ] -then - CFG_BAD_VALGRIND=1 - putvar CFG_BAD_VALGRIND -fi - if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ] then step_msg "using custom LLVM at $CFG_LLVM_ROOT" @@ -314,7 +296,7 @@ then case $LLVM_VERSION in (3.0svn | 3.0 | 3.1svn) - step_msg "found ok version of LLVM: $LLVM_VERSION" + msg "found ok version of LLVM: $LLVM_VERSION" ;; (*) err "bad LLVM version: $LLVM_VERSION, need >=3.0svn" @@ -339,8 +321,7 @@ then CFG_C_COMPILER="clang" ;; (*) - msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling" - CFG_C_COMPILER="gcc" + err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn" ;; esac else @@ -357,13 +338,6 @@ then CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}" fi -putvar CFG_HOST_TRIPLE -putvar CFG_TARGET_TRIPLES - -putvar CFG_C_COMPILER -putvar CFG_PREFIX - -putvar CFG_LLVM_ROOT step_msg "making directories" @@ -446,12 +420,9 @@ fi cd ${CFG_BUILD_DIR} -msg - # Configure llvm. Here we go... CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm -putvar CFG_LLVM_SRC_DIR for t in $CFG_TARGET_TRIPLES do @@ -500,12 +471,14 @@ do export CXXFLAGS export LDFLAGS + # FIXME: This ends up filling the screen with a bunch of LLVM configuration, + # depriving the user of seeing our configuration info cd $LLVM_BUILD_DIR # FIXME: This won't work if CFG_SRC_DIR is absolute ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS cd $CFG_BUILD_DIR else - LLVM_BUILD_DIR=bogus + LLVM_BUILD_DIR= # The user is using their own LLVM LLVM_INST_DIR=$CFG_LLVM_ROOT fi @@ -520,6 +493,43 @@ do CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _) eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'" eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'" +done + + +step_msg "writing configuration" + +putvar CFG_SRC_DIR +putvar CFG_BUILD_DIR +putvar CFG_OSTYPE +putvar CFG_CPUTYPE +putvar CFG_CONFIGURE_ARGS +putvar CFG_HOST_TRIPLE +putvar CFG_TARGET_TRIPLES +putvar CFG_C_COMPILER +putvar CFG_PREFIX + +if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T' +then + CFG_IN_TRANSITION=1 + putvar CFG_IN_TRANSITION +fi + +# Valgrind is only reliable on Linux. On Windows it doesn't work at all, and +# on the Mac the dynamic linker causes Valgrind to emit a huge stream of +# errors. +if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ] +then + CFG_BAD_VALGRIND=1 + putvar CFG_BAD_VALGRIND +fi + +putvar CFG_LLVM_ROOT +putvar CFG_LLVM_SRC_DIR + +for t in $CFG_TARGET_TRIPLES +do + CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _) + CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _) putvar $CFG_LLVM_BUILD_DIR putvar $CFG_LLVM_INST_DIR done @@ -530,6 +540,7 @@ perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \ -e 's@\\@/@go;' config.mk rm -f config.mk.bak +msg copy ${CFG_SRC_DIR}Makefile.in ./Makefile step_msg "complete" From 12f013be0e6ad3bcd81266035f6faeaa7b3245ff Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 14:32:52 -0700 Subject: [PATCH 15/19] Add clean-all rule which also cleans LLVM --- mk/clean.mk | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/mk/clean.mk b/mk/clean.mk index 2009df61f2d65..d1db178f9c004 100644 --- a/mk/clean.mk +++ b/mk/clean.mk @@ -6,8 +6,14 @@ CLEAN_STAGE_RULES = $(foreach target,$(CFG_TARGET_TRIPLES), \ clean0$(target) clean1$(target) clean2$(target) clean3$(target)) \ clean0 clean1 clean2 clean3 +CLEAN_LLVM_RULES = $(foreach target,$(CFG_TARGET_TRIPLES), \ + clean-llvm$(target)) -.PHONY: clean +.PHONY: clean clean-all clean-misc + +clean-all: clean clean-llvm + +clean-llvm: $(CLEAN_LLVM_RULES) clean: clean-misc $(CLEAN_STAGE_RULES) @@ -66,3 +72,19 @@ $(foreach target, $(CFG_TARGET_TRIPLES), \ $(eval $(call CLEAN_STAGE_N,1,$(target))) \ $(eval $(call CLEAN_STAGE_N,2,$(target))) \ $(eval $(call CLEAN_STAGE_N,3,$(target)))) + + +define DEF_CLEAN_LLVM_TARGET +ifeq ($(CFG_LLVM_ROOT),) + +clean-llvm$(1): + $$(Q)$$(MAKE) -C $$(CFG_LLVM_BUILD_DIR_$(1)) clean +else + +clean-llvm$(1): ; + +endif +endef + +$(foreach target, $(CFG_TARGET_TRIPLES), \ + $(eval $(call DEF_CLEAN_LLVM_TARGET,$(target)))) \ No newline at end of file From 184fe1eef0719815263d4b403549a94790a9ebab Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 15:19:08 -0700 Subject: [PATCH 16/19] Change the LLVM repo to git://github.com/brson/llvm.git --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 8b0b1c7a3d567..face37ff58c74 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "src/llvm"] path = src/llvm - url = http://llvm.org/git/llvm.git + url = git://github.com/brson/llvm.git From d2b7693e119dc3ac590ce4074d87d2c835013b46 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 16:02:39 -0700 Subject: [PATCH 17/19] configure: Quote the git command --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index ec530440e34d2..7c1a31ae3f96b 100755 --- a/configure +++ b/configure @@ -409,13 +409,13 @@ NEED_UPDATE=$(test "($NEED_INIT)" -o "$NEED_UPDATE_COUNT" -gt 0)$? if [ $NEED_INIT ] then msg "git: submodule init" - ${CFG_GIT} submodule init --quiet + "${CFG_GIT}" submodule init --quiet fi if [ $NEED_UPDATE ] then msg "git: submodule update" - ${CFG_GIT} submodule update --quiet + "${CFG_GIT}" submodule update --quiet fi cd ${CFG_BUILD_DIR} From e4aa891ca4c5d46b667908e46efbc745d014f7a5 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 16:13:22 -0700 Subject: [PATCH 18/19] Build LLVM with -fno-omit-frame-pointer on Linux --- mk/llvm.mk | 2 +- mk/platform.mk | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mk/llvm.mk b/mk/llvm.mk index 104fcb01f78e6..4a575b27ce119 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -9,7 +9,7 @@ ifeq ($(CFG_LLVM_ROOT),) $$(LLVM_CONFIG_$(1)): $$(LLVM_DEPS_$(1)) @$$(call E, make: llvm) - $$(Q)$$(MAKE) -C $$(CFG_LLVM_BUILD_DIR_$(1)) + $$(Q)$$(MAKE) -C $$(CFG_LLVM_BUILD_DIR_$(1)) $$(CFG_LLVM_BUILD_ENV) endif diff --git a/mk/platform.mk b/mk/platform.mk index f1dfd824e1e08..a2bdc19a0de94 100644 --- a/mk/platform.mk +++ b/mk/platform.mk @@ -64,6 +64,8 @@ ifneq ($(findstring linux,$(CFG_OSTYPE)),) endif endif CFG_INSTALL_NAME = + # Linux requires LLVM to be built like this to get backtraces into Rust code + CFG_LLVM_BUILD_ENV="CXXFLAGS=-fno-omit-frame-pointer" endif ifneq ($(findstring darwin,$(CFG_OSTYPE)),) From 72a8b18e10c88d116b2fd0491d90f03c86c29dbe Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 Nov 2011 17:36:22 -0700 Subject: [PATCH 19/19] configure: Handle absolute source paths when configuring LLVM --- configure | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 7c1a31ae3f96b..ba8e43e4b33c1 100755 --- a/configure +++ b/configure @@ -471,11 +471,15 @@ do export CXXFLAGS export LDFLAGS - # FIXME: This ends up filling the screen with a bunch of LLVM configuration, - # depriving the user of seeing our configuration info cd $LLVM_BUILD_DIR - # FIXME: This won't work if CFG_SRC_DIR is absolute - ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS + case $CFG_SRC_DIR in + /* | [a-z]:* | [A-Z]:*) + ${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS + ;; + *) + ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS + ;; + esac cd $CFG_BUILD_DIR else LLVM_BUILD_DIR=