[vmkit-commits] [vmkit] r180518 - Added debug mode to VMKit.

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 10:20:37 PDT 2013


Author: peter.senna
Date: Thu Apr 25 12:19:07 2013
New Revision: 180518

URL: http://llvm.org/viewvc/llvm-project?rev=180518&view=rev
Log:
Added debug mode to VMKit.
Updated LLVM patch.
Updated README.
You need to use LLVM release 3.2, and apply the patch (now modified) on it if you want debug mode.
(cherry picked from commit e926e89884a2bb46b91d381d686439a33c625aaf)

Modified:
    vmkit/trunk/Makefile.rules
    vmkit/trunk/README.TXT
    vmkit/trunk/patches/llvm.patch

Modified: vmkit/trunk/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=180518&r1=180517&r2=180518&view=diff
==============================================================================
--- vmkit/trunk/Makefile.rules (original)
+++ vmkit/trunk/Makefile.rules Thu Apr 25 12:19:07 2013
@@ -1,177 +1,339 @@
-VMJC      := $(ToolDir)/vmjc$(EXEEXT)
 
+.PHONY: all tidy clean distclean confclean
+.SECONDARY:
+.SUFFIXES:
+#.SUFFIXES: .c .cpp .cxx .cc .h .hpp .o .a .bc .ll .jar $(SHLIBEXT) $(EXEEXT)
+
+all::
+
+###############################################################################
+#   Main options
+###############################################################################
+ifeq ($(OPTIMIZED),1)
+  BUILD_NAME:=Release
+  ifeq ($(DEBUG),1)
+    BUILD_NAME:=$(BUILD_NAME)+Debug
+  endif
+else
+  ifeq ($(DEBUG),1)
+    BUILD_NAME:=Debug
+  else
+    BUILD_NAME:=Unoptimized
+  endif
+endif
 
-# Set the LLVM build file location 
-LLVMBuildTool   := $(LLVM_SRC_ROOT)/utils/llvm-build/llvm-build
+ifeq ($(ASSERT),1)
+  BUILD_NAME:=$(BUILD_NAME)+Asserts
+else
+  COMMON_CFLAGS+=-DNDEBUG
+endif
 
-###############################################################################
-# VMKIT_RUNTIME: Provide rules to build a .cpp file with LLVM instructions
-#                generating code matching the .ll files.
-###############################################################################
+ifeq ($(DEBUG),1)
+  COMMON_CFLAGS+=-g3 -fno-limit-debug-info
+endif
 
-ifdef VMKIT_RUNTIME
+ifeq ($(OPTIMIZED),1)
+  LLC_FLAGS+= -O=3
+  OPT_FLAGS+= -disable-opt
+  COMMON_CFLAGS+= -O3
+else
+  LLC_FLAGS+=-O=0 -asm-verbose
+  OPT_FLAGS+=-disable-opt
+  COMMON_CFLAGS+=-O0
+  PRECOMPILER_OPT+=-disable-opt
+endif
 
-.PRECIOUS: LLVMRuntime.inc
+LLC_FLAGS+=-disable-cfi -disable-fp-elim -relocation-model=pic 
+OPT_FLAGS+=-disable-cfi -disable-fp-elim 
 
-LLVMRuntime.inc : $(LLVMAS) $(LLC) $(VMKIT_RUNTIME)
-	$(Echo) "Building LLVM runtime with $(VMKIT_RUNTIME)"
-	$(Verb) cat $(VMKIT_RUNTIME) | $(LLVMAS) -o - | $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=contents -o $@
+INCLUDES+=-I$(PROJ_SRC_CWD) -I$(PROJ_SRC_ROOT)/include -I$(PROJ_SRC_ROOT)/lib/vmkit/MMTk -I$(BUILD_DIR) \
+					-I$(shell $(LLVM_CONFIG) --includedir)
 
-all-local:: LLVMRuntime.inc
+WARN_CFLAGS=  -Wall -Wno-long-long -Wno-variadic-macros -Wno-unused-private-field -Wno-unused-variable
+COMMON_CFLAGS+= $(INCLUDES) -ansi -pedantic $(WARN_CFLAGS) -fPIC \
+								-D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS \
+								-fno-strict-aliasing -fno-omit-frame-pointer -fvisibility-inlines-hidden 
 
-clean-local::
-	$(Verb) $(RM) -f LLVMRuntime.inc
+CFLAGS+=$(COMMON_CFLAGS) 
+CXXFLAGS+=$(COMMON_CFLAGS) -Woverloaded-virtual -Wcast-qual -fno-rtti -fno-exceptions
+LDFLAGS+=$(COMMON_CFLAGS) $(shell $(LLVM_CONFIG) --ldflags) $(LDOPT)
+SHOPT+=$(COMMON_CFLAGS)
+LIBS+=$(shell $(LLVM_CONFIG) --libs) -lz
 
-endif
+DEPEND_OPTIONS=-MMD -MP -MF "$(BUILD_DIR)/$$*.d.tmp" -MT "$(BUILD_DIR)/$$*.bc" -MT "$(BUILD_DIR)/$$*.d"
+DOM=then mv -f "$(BUILD_DIR)/$$*.d.tmp" "$(BUILD_DIR)/$$*.d"; else rm -f "$(BUILD_DIR)/$$*.d.tmp"; exit 1; fi
 
 ###############################################################################
-# VMJC_ASSEMBLY: Provide rules to build glibj.zip.s.
+#   Nice printing
 ###############################################################################
+ifndef PROF
+PROF=.
+all::
+	$(Echo) "Entering compilation process"
+endif
+
+EchoMsg="[$(PROJECT_NAME) $(PROF)]:"
+Echo=@echo $(EchoMsg)
+
+ifndef VERBOSE
+	SUB_OPT=--no-print-directory
+  Verb:=@
+endif
 
-ifdef VMJC_ASSEMBLY
+###############################################################################
+#   Recursive target managment
+###############################################################################
+RECURSIVE_TARGETS=all clean distclean
 
-.PRECIOUS: glibj.zip.s
+$(RECURSIVE_TARGETS)::
+	$(Verb) for f in $(DIRS); do \
+		$(MAKE) $(SUB_OPT) -C $$f $@ PROF=$(PROF)/$$f; \
+		if [ $$? != 0 ]; then echo "$(EchoMsg) abort with error in $(PROF)/$$f"; exit 1; fi \
+	done; exit 0;
 
-glibj.zip.s : $(LOPT) $(LLC) $(VMJC)
+tidy:
+	$(Echo) Cleaning temporary files
+	$(Verb) find $(PROJ_OBJ_ROOT) -iname "*~" -exec rm -f {} \;
 
-glibj.zip.bc :
-	$(Echo) "Compiling glibj.zip to llvm"
-	$(Verb) if test -d $(GLIBJ); then \
-	  $(VMJC) -f $(VMJC_GLIBJ_FLAGS) $(GLIBJ)/glibj.zip -o glibj.zip.bc; \
-	else \
-	  $(VMJC) -f $(VMJC_GLIBJ_FLAGS) $(GLIBJ) -o glibj.zip.bc; \
-	fi
-	
-glibj-optimized.zip.bc : glibj.zip.bc
-	$(Echo) "Optimizing glibj.zip"
-	$(Verb) $(LOPT) $(OPT_VMJC_FLAGS) -f glibj.zip.bc -o glibj-optimized.zip.bc
+clean::
+	$(Echo) "Cleaning compilation files"
+	$(Verb) rm -Rf $(BUILD_NAME)
 
-glibj.zip.s : glibj-optimized.zip.bc
-	$(Echo) "Compiling glibj.zip.bc to native"
-	$(Verb) $(LLC) $(LLC_GLIBJ_FLAGS) -disable-cfi -relocation-model=pic -disable-fp-elim glibj-optimized.zip.bc -o glibj.zip.s
+distclean::
+	$(Echo) "Cleaning all compilation files"
+	$(Verb) rm -Rf Release* Debug* Unoptimized*
 
-$(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES)
-	$(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG)
-	$(Verb) $(Compile.C) $< -o $(ObjDir)/$*.o
+confclean: clean
+	$(Echo) Cleaning configuration
+	$(Verb) rm -Rf $(PROJ_OBJ_ROOT)/Makefile.common
+	$(Verb) rm -Rf $(PROJ_OBJ_ROOT)/config.status $(PROJ_OBJ_ROOT)/config.log
+	$(Verb) rm -Rf $(PROJ_OBJ_ROOT)/autoconf/autom4te.cache $(PROJ_OBJ_ROOT)/autoconf/configure.bak
 
-clean-local::
-	$(Verb) $(RM) -f glibj.zip.s glibj.zip.bc glibj-optimized.zip.bc
-endif
+%/.dir:
+	$(Verb) $(MKDIR) $(dir $@) && $(TOUCH) $@
 
 ###############################################################################
-# RUN_ANT: Provide rules to build MMTk into a .o file and inlining facilities.
+#   Build system managment
 ###############################################################################
+#SELF=$(PROJ_SRC_ROOT)/Makefile.rules $(PROJ_OBJ_ROOT)/Makefile.common Makefile
 
-ifdef RUN_ANT
+$(LEVEL)/Makefile.common: $(PROJ_OBJ_ROOT)/Makefile.common
 
-MMTkLib = $(LibDir)/libFinalMMTk.a
+define define_config_rule
+$$(PROJ_OBJ_ROOT)/$1: $$(PROJ_SRC_ROOT)/$1.in $$(PROJ_SRC_ROOT)/configure
+	$(Echo) "Regenerating project files $$1"
+	$(Verb) cd $(PROJ_OBJ_ROOT) && ./config.status -q --$2=$1
+	$(Verb) touch $$@
+endef
 
-ifeq ($(shell [ ! -e $(MMTkLib) ] && echo "1"), 1)
-  COMPILE_MMTK = 1
-endif
+$(foreach cur,$(CONFIG_FILES),$(eval $(call define_config_rule,$(cur),file)))
+$(foreach cur,$(CONFIG_HEADERS),$(eval $(call define_config_rule,$(cur),header)))
 
-ifeq ($(COMPILE_MMTK), 1)
-  all::
-	$(Verb) $(ANT) -buildfile $(PROJ_OBJ_ROOT)/mmtk/java/build.xml
-	$(Echo) Building $(BuildMode) $(JARNAME).jar $(notdir $@)
-	$(Verb) $(LOPT) -load=$(LibDir)/JITGCPass$(SHLIBEXT) $(OPT_MMTK_FLAGS) -JITGCPass -f $(LibDir)/MMTKAlloc.bc -o $(LibDir)/MMTKAlloc.bc
-	$(Verb) $(VMJC) $(VMJC_MMTK_FLAGS) -load=$(LibDir)/MMTKRuntime$(SHLIBEXT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled
-	$(Verb) $(LOPT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) $(OPT_MMTK_FLAGS) -LowerJavaRT -f $(JARNAME).bc -o $(JARNAME)-optimized.bc
-	$(Verb) $(LLVMLINK) -o $(LibDir)/FinalMMTk.bc $(LibDir)/MMTKAlloc.bc $(JARNAME)-optimized.bc $(LibDir)/MMTKRuntime.bc
-	$(Verb) $(LOPT) $(LibDir)/FinalMMTk.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) $(OPT_MMTK_FLAGS) -StaticGCPass -o $(LibDir)/FinalMMTk.bc
-	$(Verb) $(MKDIR) $(ObjDir)
-	$(Verb) $(LLC) $(LLC_ASM_FLAGS) -disable-fp-elim -disable-cfi -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) $(LibDir)/FinalMMTk.bc -o $(ObjDir)/FinalMMTk.s
-	$(Verb) $(GREP) -v '\.loc[^0-9]\+[0-9]\+ 0' $(ObjDir)/FinalMMTk.s > $(ObjDir)/FinalMMTk.s.remove_invalid_dot_loc
-	$(Verb) $(MV) -f $(ObjDir)/FinalMMTk.s.remove_invalid_dot_loc $(ObjDir)/FinalMMTk.s
-	$(Verb) $(LLVMCC) -c $(ObjDir)/FinalMMTk.s -o $(ObjDir)/FinalMMTk.o
-	$(Verb) $(Archive) $(LibDir)/libFinalMMTk.a $(ObjDir)/FinalMMTk.o
-	$(Verb) $(Ranlib) $(LibDir)/libFinalMMTk.a
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=VTgcmalloc $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkVTMallocInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=vmkitgcmalloc $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkVMKitMallocInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=fieldWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkFieldWriteInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=arrayWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkArrayWriteInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=nonHeapWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkNonHeapWriteInline.inc
-endif
-
-clean-local::
-	$(Verb) $(RM) -rf classes $(JARNAME).jar $(JARNAME).bc $(JARNAME)-optimized.bc $(ObjDir)
-endif
+$(PROJ_OBJ_ROOT)/configure: $(PROJ_SRC_ROOT)/autoconf/configure.ac $(PROJ_SRC_ROOT)/autoconf/AutoRegen.sh 
+	$(Echo) "Rebootstraping project"
+	$(Verb) cd $(PROJ_SRC_ROOT)/autoconf && ./AutoRegen.sh
+	$(Verb) cd $(PROJ_OBJ_ROOT) && ./config.status --recheck
 
 ###############################################################################
-# MODULE_WITH_GC: Provide rules for building .cpp files into an archive with
-#                 GC symbol information.
+#   Build directories and generated binaries
 ###############################################################################
+BIN_DIR=$(PROJ_OBJ_ROOT)/$(BUILD_NAME)/bin
+LIB_DIR=$(PROJ_OBJ_ROOT)/$(BUILD_NAME)/lib
+BUILD_DIR=$(PROJ_OBJ_CWD)/$(BUILD_NAME)
 
-ifdef MODULE_WITH_GC
+STATIC_GC_PASS_LIB=$(LIB_DIR)/static-gc-pass$(SHLIBEXT)
+STATIC_GC_PRINTER_LIB=$(LIB_DIR)/static-gc-printer$(SHLIBEXT)
+VMJC=$(BIN_DIR)/vmjc$(EXEEXT)
+PRECOMPILER=$(BIN_DIR)/precompiler
 
-ObjectsBCWithGC   := $(BaseNameSources:%=$(ObjDir)/%_gc.bc)
-ObjectsSWithGC    := $(BaseNameSources:%=$(ObjDir)/%_gc.s)
-ObjectsWithGC     := $(BaseNameSources:%=$(ObjDir)/%_gc.o)
-AModule           := $(LibDir)/lib$(MODULE_WITH_GC).a
-
-$(ObjectsBCWithGC): $(ObjDir)/%_gc.bc: $(ObjDir)/%.ll $(LOPT)
-	$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
-	$(Verb) $(LOPT) $< -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPass$(SHLIBEXT) $(OPT_BC_WITH_GC_FLAGS) -StaticGCPass -o $@
-
-$(ObjectsSWithGC): $(ObjDir)/%_gc.s: $(ObjDir)/%_gc.bc $(LLC)
-	$(Echo) "Compiling $*.bc to $*.s for $(BuildMode) build"
-	$(Verb) $(LLC) $(LLC_ASM_FLAGS) -disable-cfi -disable-fp-elim -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPrinter$(SHLIBEXT) $< -o $@
-
-$(ObjectsWithGC): $(ObjDir)/%_gc.o: $(ObjDir)/%_gc.s $(ObjDir)/.dir
-	$(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG)
-	$(Verb) $(Compile.C) $< -o $@
+###############################################################################
+#   Main targets
+###############################################################################
+ifdef TOOL
+MODULE=$(TOOL)
 
-$(AModule): $(ObjectsWithGC) $(LibDir)/.dir
-	$(Echo) Building $(BuildMode) Archive Library $(notdir $@)
-	-$(Verb) $(RM) -f $@
-	$(Verb) $(Archive) $@ $(ObjectsWithGC)
-	$(Verb) $(Ranlib) $@
+all:: $(BIN_DIR)/$(TOOL)$(EXEEXT)
+endif
 
-all-local:: $(AModule)
+ifdef LIBRARY
+MODULE=$(LIBRARY)
 
-clean-local::
-	-$(Verb) $(RM) -f $(AModule) $(ObjectsBCWithGC) $(ObjectsSWithGC) $(ObjectsWithGC)
+all:: $(LIB_DIR)/$(LIBRARY)$(SHLIBEXT)
+endif
 
+ifdef MODULE_WITH_GC
+MODULE=$(MODULE_WITH_GC)
+NEED_GC=1
 endif
 
 ###############################################################################
-# BUILD_FRAMETABLE: Generate files for easy access of frametables at runtime.
+#   GC passes
 ###############################################################################
+ifdef NEED_GC
+LLC_GC_FLAGS+=-load=$(STATIC_GC_PRINTER_LIB)
+GC_ID=-gc
+
+%$(GC_ID).bc: %.bc
+	$(Echo) "Preparing GC '$(notdir $<)'"
+	$(Verb) $(LOPT) -load=$(STATIC_GC_PASS_LIB) $(OPT_FLAGS) -inline -StaticGCPass $< -o $@
 
-ifdef BUILD_FRAMETABLE
+endif
 
-FrametablesExterns.inc: $(ProjLibsPaths)
-	$(Verb) nm $(ProjLibsPaths) | grep __frametable | sed 's/\([a-f0-9]*\) \([a-zA-Z]*\) _*\([a-zA-Z0-9_]*\)/extern "C" CompiledFrames \3;/' > $@
+###############################################################################
+#   Module
+###############################################################################
+ifdef MODULE
+
+MODULE_A=$(LIB_DIR)/lib$(MODULE).a
 
-FrametablesSymbols.inc: $(ProjLibsPaths)
-	$(Verb) nm $(ProjLibsPaths) | grep __frametable | sed 's/\([a-f0-9]*\) \([a-zA-Z]*\) _*\([a-zA-Z0-9_]*\)/\&\3,/' > $@
+all:: $(MODULE_A)
 
-all-local:: FrametablesExterns.inc FrametablesSymbols.inc
+ifdef EXTRACT_FUNCTIONS
+all:: $(LIB_DIR)/$(MODULE)-inliner.o
+MODULE_A_DEP=$(LIB_DIR)/$(MODULE)-inliner.o
+NEED_BC=1
+endif
 
-clean-local::
-	-$(Verb) $(RM) -f FrametablesExterns.inc FrametablesSymbols.inc
-	
+define all-suffixes
+	$(wildcard *$1) $(filter %$1, $(GEN))
+endef
+
+CLANG_FILES=$(patsubst %.c,$(BUILD_DIR)/%,$(call all-suffixes,.c)) \
+            $(patsubst %.cc,$(BUILD_DIR)/%,$(call all-suffixes,.cc)) \
+            $(patsubst %.cpp,$(BUILD_DIR)/%,$(call all-suffixes,.cpp))
+
+BC_FILES=$(addsuffix .bc,$(CLANG_FILES)) $(addprefix $(BUILD_DIR)/,$(filter %.bc, $(GEN)))
+
+ifdef NEED_BC
+# if we need bytecode, we link a module with all the bc in the build_dir directory, optimize this module
+# assemble this module and finally create the archive
+all:: $(LIB_DIR)/$(MODULE).bc
+
+$(LIB_DIR)/$(MODULE).bc $(LIB_DIR)/$(MODULE)-inliner.bc: $(LIB_DIR)/%.bc: $(BUILD_DIR)/%$(GC_ID).bc $(LIB_DIR)/.dir
+	$(Verb) $(CP) $< $@
+
+$(BUILD_DIR)/$(MODULE).bc: $(BC_FILES) $(patsubst %, $(LIB_DIR)/%.bc,$(MODULE_USE))
+	$(Echo) "Linking module '$(notdir $@)'"
+	$(Verb) $(LLVMLINK) $^ -o $@
+
+MODULE_A_DEP+=$(BUILD_DIR)/$(MODULE)$(GC_ID).o
+else
+# for most of the module, we avoid a full module creation, mainly because I have bugs in llc
+# in this case, we build a set of .o files and archive them together
+# each .o is optimized and assembled
+MODULE_A_DEP=$(patsubst %.bc,%$(GC_ID).o,$(BC_FILES)) $(patsubst %, $(LIB_DIR)/lib%.a,$(MODULE_USE))
 endif
 
 ###############################################################################
-# COMPILE_OPENJDK_ZIP: Build the specified java sources and zip them up
+#   OpenJDK definitions
 ###############################################################################
-ifeq ($(COMPILE_OPENJDK_ZIP), 1)
+ifeq ($(MODULE), Classpath)
+ifeq ($(CLASSPATH_IMPL), openjdk)
+	VMKIT_OPENJDK_ZIP=$(BUILD_DIR)/vmkit-openjdk.zip
+	CLASSES_DIR=$(PROJ_SRC_CWD)/classes
+	MODULE_A_DEP+=$(VMKIT_OPENJDK_ZIP)
+	OPENJDK_JAVA_SOURCES=$(PROJ_SRC_CWD)/java/lang/VMString.java
+endif
+endif
 
-# Some variables
-VMKIT_OPENJDK_ZIP=$(PROJ_OBJ_DIR)/vmkit-openjdk.zip
-CLASSES_DIR=$(PROJ_OBJ_DIR)/classes
+$(MODULE_A): $(MODULE_A_DEP) $(LIB_DIR)/.dir
+	$(Echo) "Building archive '$(notdir $@)'"
+	-$(Verb) $(RM) -f $@
+	$(Verb) $(Archive) $@ $(MODULE_A_DEP)
+	$(Verb) $(Ranlib) $@
 
-all-local:: $(VMKIT_OPENJDK_ZIP)
-clean-local::
-	-$(Verb) $(RM) -f $(CLASSES_DIR) $(VMKIT_OPENJDK_ZIP)
+endif
 
+###############################################################################
+#   Inliner
+###############################################################################
+$(BUILD_DIR)/$(MODULE)-inliner.cc: $(BUILD_DIR)/$(MODULE)$(GC_ID).bc $(SELF)
+	$(Echo) "Generating inliner $(notdir $@)"
+	$(Verb) doit() { \
+						echo '#include "vmkit/InlineCommon.h"'; \
+			    	echo 'using namespace llvm;'; \
+						echo 'namespace vmkit {'; \
+						for F in $(EXTRACT_FUNCTIONS); do \
+							$(LOPT) $(OPT_FLAGS) $< -o - | $(LLC) $(LLC_FLAGS) -march=cpp -cppgen=function -cppfor=$$F -o - \
+									| sed -e "s/makeLLVMFunction/makeLLVMFunction_$(MODULE)_$$F/"; [ $$? -ne 0 ] && exit 1; \
+						done; \
+						echo "void makeLLVMFunctions_$(MODULE)(Module *mod) {"; \
+						for F in $(EXTRACT_FUNCTIONS); do \
+							echo "  vmkit::makeLLVMFunction_$(MODULE)_$$F(mod);"; \
+						done; \
+						echo "}"; \
+						echo "}"; \
+						exit 0; \
+				 }; doit > $@
+
+###############################################################################
+#   Linking
+###############################################################################
+DEP_LIBS=$(patsubst %,$(LIB_DIR)/lib%.a,$(LINK_USE))
+
+$(BIN_DIR)/$(TOOL)$(EXEEXT): $(MODULE_A) $(DEP_LIBS) $(BUILD_DIR)/frametables.o $(SELF) $(BIN_DIR)/.dir
+	$(Echo) "Linking executable '$(notdir $@)'"
+	$(Verb) $(CLANGXX) -o $@  $(LDFLAGS) $(MODULE_A) $(BUILD_DIR)/frametables.o $(DEP_LIBS) $(DEP_LIBS) $(LIBS)
+
+$(LIB_DIR)/$(LIBRARY)$(SHLIBEXT): $(MODULE_A) $(DEP_LIBS) $(SELF) $(LIB_DIR)/.dir
+	$(Echo) "Linking shared library '$(notdir $@)'"
+	$(Verb) $(CLANGXX) -o $@ $(SHOPT) -shared -Wl,--whole-archive $(MODULE_A) -Wl,--no-whole-archive $(DEP_LIBS)
+
+###############################################################################
+#   Frametables
+###############################################################################
+$(BUILD_DIR)/frametables.cc: $(MODULE_A) $(DEP_LIBS) $(SELF) $(BUILD_DIR)/.dir 
+	$(Echo) "Generating frametables of $(notdir $(TOOL))" #$(notdir $(DEP_LIBS))"
+	$(Verb) doit() { \
+						F="$(MODULE_A) $(DEP_LIBS)"; \
+	          echo '#include "vmkit/MethodInfo.h"'; \
+						echo 'using namespace vmkit;'; \
+						$(NM) $$F | grep __frametable | sed 's/\([a-f0-9]*\) \([a-zA-Z]*\) _*\([a-zA-Z0-9_]*\)/extern "C" CompiledFrames \3;/'; \
+						echo 'CompiledFrames* vmkit::initialFrametables[] = {'; \
+						$(NM) $$F | grep __frametable | sed 's/\([a-f0-9]*\) \([a-zA-Z]*\) _*\([a-zA-Z0-9_]*\)/\&\3,/'; \
+						echo "0"; \
+						echo "};"; \
+					}; doit > $@
+
+###############################################################################
+# vmkit runtime generated files
+###############################################################################
+ifdef VMKIT_RUNTIME_OUT
+all:: $(BUILD_DIR)/$(VMKIT_RUNTIME_OUT)
+
+BUILT_INC+=$(BUILD_DIR)/$(VMKIT_RUNTIME_OUT)
+
+$(BUILD_DIR)/$(VMKIT_RUNTIME_OUT): $(VMKIT_RUNTIME_IN) $(SELF) $(BUILD_DIR)/.dir
+	$(Echo) "Generating '$(notdir $@)'"
+	$(Verb) cat $(VMKIT_RUNTIME_IN) | $(LLVMAS) -o - | $(LLC) $(LLC_FLAGS) -march=cpp -cppgen=contents -o $@
 
-$(VMKIT_OPENJDK_ZIP): $(addprefix $(PROJ_SRC_DIR)/,$(OPENJDK_JAVA_SOURCES))
-	$(Echo) "Building OpenJDK java sources into zip"
-	-$(Verb) $(RM) -rf $@ $(CLASSES_DIR)
-	$(Verb) $(MKDIR) $(CLASSES_DIR)
-	$(Verb) $(JAVAC) $^ -d $(CLASSES_DIR)
-	cd $(CLASSES_DIR) && $(ZIP) -qr $(VMKIT_OPENJDK_ZIP) .
+endif
 
+###############################################################################
+# object rules
+###############################################################################
+%.o: %.bc
+	$(Echo) "Assembling '$(notdir $<)'"
+	$(Verb) $(LLC) $(LLC_FLAGS) $(LLC_GC_FLAGS) -filetype=obj $< -o $@
+
+define define_compile_rule
+$(BUILD_DIR)/%.bc: %$1 $(BUILT_INC) $(SELF) $(BUILD_DIR)/.dir
+	$(Echo) "Compiling '$$(notdir $$<)'"
+	$(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM)
+
+$(BUILD_DIR)/%.bc: $(BUILD_DIR)/%$1 $(BUILT_INC) $(SELF) $(BUILD_DIR)/.dir
+	$(Echo) "Compiling '$$(notdir $$<)'"
+	$(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM)
+endef
+
+$(eval $(call define_compile_rule,.cpp,$(CLANGXX),$(CXXFLAGS)))
+$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS)))
+$(eval $(call define_compile_rule,.c,$(CLANG),$(CFLAGS)))
+
+ifneq ($(MAKECMDGOALS),tidy)
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(MAKECMDGOALS),distclean)
+-include $(addsuffix .d,$(CLANG_FILES))
+endif
+endif
 endif

Modified: vmkit/trunk/README.TXT
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/README.TXT?rev=180518&r1=180517&r2=180518&view=diff
==============================================================================
--- vmkit/trunk/README.TXT (original)
+++ vmkit/trunk/README.TXT Thu Apr 25 12:19:07 2013
@@ -53,30 +53,31 @@ ln -sf ../native/jni/java-util/.libs/lib
 LLVM:
 =====
 
-* Get it (git):
+* Get the compatible release LLVM 3.2:
 
-git clone http://llvm.org/git/llvm.git
-cd llvm/tools
-git clone http://llvm.org/git/clang.git
-cd clang
-git config branch.master.rebase true
-cd ../..
-git config branch.master.rebase true
-
-* You can also get it via svn:
-
-svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
-cd llvm/tools
-svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
+wget http://llvm.org/releases/3.2/llvm-3.2.src.tar.gz
+tar zxf llvm-3.2.src.tar.gz
+cd llvm-3.2.src/tools
+wget http://llvm.org/releases/3.2/clang-3.2.src.tar.gz
+tar zxf clang-3.2.src.tar.gz
+mv clang-3.2.src clang
 cd ../projects
-svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
-cd ..
+wget http://llvm.org/releases/3.2/compiler-rt-3.2.src.tar.gz
+tar zxf compiler-rt-3.2.src.tar.gz
+mv compiler-rt-3.2.src compiler-rt
+cd ../..
 
-* Patch it if you want to have a better debug support:
+* Patch LLVM if you want to have a better debug support for VMKit:
+  You will have to get VMKit (see the next section) to find the patch.
 
-cd llvm
+cd llvm-3.2.src
 patch -p1 < ../vmkit2/patches/llvm.patch
 
+NOTICE:
+* VMKit does not support building LLVM out of source because of a bug
+  in "llvm-config", so please build in the source, and keep different source
+  trees for different configurations/architectures of builds.
+
 * Make it (release mode):
 
 ./configure --enable-optimized --enable-assertions --enable-jit --enable-threads --enable-pthreads --enable-pic --enable-targets=x86,cpp --disable-docs --disable-doxygen
@@ -86,24 +87,34 @@ make -j12 BUILD_EXAMPLES=0 ENABLE_DOCS=0
 
 ./configure --disable-optimized --enable-assertions --enable-debug-runtime --enable-debug-symbols --enable-keep-symbols --enable-jit --enable-threads --enable-pthreads --enable-pic --enable-targets=x86,cpp --disable-docs --disable-doxygen
 
+* Build it:
+
 make -j12 BUILD_EXAMPLES=0 ENABLE_DOCS=0
 
 ======
 VMKit:
 ======
 
-* Get it (git):
+* Get it anonymously (git):
 
 git clone git://scm.gforge.inria.fr/vmkit2/vmkit2.git
 
-* or
+* or get as an official developer (Git):
 
 git clone git+ssh://YOUR_USER_NAME@gforge.inria.fr//gitroot/vmkit2/vmkit2.git
 
-* Make it (debug mode):
+* Make it (release mode):
 
-./configure --with-llvmsrc=@PATH_TO_LLVM@ --with-llvmobj=@PATH_TO_LLVM@ --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@ --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip
+./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip
 
-* Buil it:
-make -j12
+* Or you can make it in debug mode:
+
+./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip --enable-assert=yes --disable-optimized --enable-debug=yes
+
+* Or you can enable OSGi Incinerator build:
 
+./configure --with-llvm-config-path=@PATH_TO_LLVM@/Release+Asserts/bin/llvm-config --with-gnu-classpath-libs=@PATH_TO_GNUCLASSPATH@/lib --with-gnu-classpath-glibj=@PATH_TO_GNUCLASSPATH@/lib/glibj.zip --enable-incinerator=yes
+
+* Build it:
+
+make -j12

Modified: vmkit/trunk/patches/llvm.patch
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/patches/llvm.patch?rev=180518&r1=180517&r2=180518&view=diff
==============================================================================
--- vmkit/trunk/patches/llvm.patch (original)
+++ vmkit/trunk/patches/llvm.patch Thu Apr 25 12:19:07 2013
@@ -1,8 +1,9 @@
-diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
-index d74a703..1831bb6 100644
---- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
-+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
-@@ -173,7 +173,7 @@ bool AsmPrinter::doInitialization(Module &M) {
+--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp	2012-11-01 10:14:31.000000000 +0100
++++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp	2013-03-28 17:37:24.297848000 +0100
+@@ -174,22 +174,22 @@ bool AsmPrinter::doInitialization(Module
+ 
+   GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+   assert(MI && "AsmPrinter didn't require GCModuleInfo?");
    for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I)
      if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
        MP->beginAssembly(*this);
@@ -11,7 +12,8 @@ index d74a703..1831bb6 100644
    // Emit module-level inline asm if it exists.
    if (!M.getModuleInlineAsm().empty()) {
      OutStreamer.AddComment("Start of file scope inline assembly");
-@@ -182,7 +182,7 @@ bool AsmPrinter::doInitialization(Module &M) {
+     OutStreamer.AddBlankLine();
+     EmitInlineAsm(M.getModuleInlineAsm()+"\n");
      OutStreamer.AddComment("End of file scope inline assembly");
      OutStreamer.AddBlankLine();
    }
@@ -20,7 +22,13 @@ index d74a703..1831bb6 100644
    if (MAI->doesSupportDebugInformation())
      DD = new DwarfDebug(this, &M);
  
-@@ -929,6 +929,15 @@ bool AsmPrinter::doFinalization(Module &M) {
+   switch (MAI->getExceptionHandlingType()) {
+   case ExceptionHandling::None:
+     return false;
+@@ -925,12 +925,21 @@ bool AsmPrinter::doFinalization(Module &
+   GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
+   assert(MI && "AsmPrinter didn't require GCModuleInfo?");
+   for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
      if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I))
        MP->finishAssembly(*this);
  
@@ -36,11 +44,15 @@ index d74a703..1831bb6 100644
    // If we don't have any trampolines, then we don't require stack memory
    // to be executable. Some targets have a directive to declare this.
    Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
-diff --git a/lib/Target/CppBackend/CPPBackend.cpp b/lib/Target/CppBackend/CPPBackend.cpp
-index 0f3efd8..d96a258 100644
---- a/lib/Target/CppBackend/CPPBackend.cpp
-+++ b/lib/Target/CppBackend/CPPBackend.cpp
-@@ -375,6 +375,7 @@ std::string CppWriter::getCppName(Type* Ty) {
+   if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
+     if (const MCSection *S = MAI->getNonexecutableStackSection(OutContext))
+       OutStreamer.SwitchSection(S);
+--- a/lib/Target/CppBackend/CPPBackend.cpp	2012-11-23 20:56:57.000000000 +0100
++++ b/lib/Target/CppBackend/CPPBackend.cpp	2013-03-28 17:37:24.302140000 +0100
+@@ -372,12 +372,13 @@ std::string CppWriter::getCppName(Type*
+     }
+     case Type::X86_FP80TyID: return "Type::getX86_FP80Ty(mod->getContext())";
+     case Type::FloatTyID:    return "Type::getFloatTy(mod->getContext())";
      case Type::DoubleTyID:   return "Type::getDoubleTy(mod->getContext())";
      case Type::LabelTyID:    return "Type::getLabelTy(mod->getContext())";
      case Type::X86_MMXTyID:  return "Type::getX86_MMXTy(mod->getContext())";
@@ -48,7 +60,13 @@ index 0f3efd8..d96a258 100644
      default:
        error("Invalid primitive type");
        break;
-@@ -445,6 +446,8 @@ std::string CppWriter::getCppName(const Value* val) {
+     }
+     // shouldn't be returned, but make it sensible
+     return "Type::getVoidTy(mod->getContext())";
+@@ -442,12 +443,14 @@ std::string CppWriter::getCppName(const
+         name += std::string("_") + utostr(uniqueNum++);
+       UsedNames.insert(name);
+       return ValueNames[val] = name;
      } else {
        name = getTypePrefix(val->getType());
      }
@@ -57,7 +75,13 @@ index 0f3efd8..d96a258 100644
    } else {
      name = getTypePrefix(val->getType());
    }
-@@ -1411,6 +1414,10 @@ void CppWriter::printInstruction(const Instruction *I,
+   if (val->hasName())
+     name += val->getName();
+   else
+@@ -1408,12 +1411,16 @@ void CppWriter::printInstruction(const I
+           << getCppName(ila->getFunctionType()) << ", \""
+           << ila->getAsmString() << "\", \""
+           << ila->getConstraintString() << "\","
            << (ila->hasSideEffects() ? "true" : "false") << ");";
        nl(Out);
      }
@@ -68,3 +92,67 @@ index 0f3efd8..d96a258 100644
      if (call->getNumArgOperands() > 1) {
        Out << "std::vector<Value*> " << iName << "_params;";
        nl(Out);
+       for (unsigned i = 0; i < call->getNumArgOperands(); ++i) {
+         Out << iName << "_params.push_back(" << opNames[i] << ");";
+         nl(Out);
+--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp	2012-11-07 06:19:04.000000000 +0100
++++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp	2013-03-30 01:20:19.820477000 +0100
+@@ -1149,21 +1149,22 @@ const MCSymbol *DwarfDebug::getLabelAfte
+ /// beginInstruction - Process beginning of an instruction.
+ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
+   // Check if source location changes, but ignore DBG_VALUE locations.
+   if (!MI->isDebugValue()) {
+     DebugLoc DL = MI->getDebugLoc();
+     if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
+-      unsigned Flags = 0;
++      unsigned Flags = DWARF2_FLAG_IS_STMT;
+       PrevInstLoc = DL;
+       if (DL == PrologEndLoc) {
+         Flags |= DWARF2_FLAG_PROLOGUE_END;
+         PrologEndLoc = DebugLoc();
+       }
++/*
+       if (PrologEndLoc.isUnknown())
+         Flags |= DWARF2_FLAG_IS_STMT;
+-
++*/
+       if (!DL.isUnknown()) {
+         const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
+         recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
+       } else
+         recordSourceLine(0, 0, 0, 0);
+     }
+@@ -1439,13 +1440,13 @@ void DwarfDebug::beginFunction(const Mac
+   // Record beginning of function.
+   if (!PrologEndLoc.isUnknown()) {
+     DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
+                                        MF->getFunction()->getContext());
+     recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
+                      FnStartDL.getScope(MF->getFunction()->getContext()),
+-                     0);
++                     DWARF2_FLAG_IS_STMT);
+   }
+ }
+ 
+ void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
+ //  SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
+   ScopeVariables[LS].push_back(Var);
+--- a/test/DebugInfo/X86/ending-run.ll	2012-04-05 22:39:05.000000000 +0200
++++ b/test/DebugInfo/X86/ending-run.ll	2013-03-30 01:25:51.458268000 +0100
+@@ -1,14 +1,12 @@
+ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
+ ; RUN: llvm-dwarfdump %t | FileCheck %s
+ 
+-; Check that the line table starts at 7, not 4, but that the first
+-; statement isn't until line 8.
++; Check that the line table starts at 7, not 4.
+ 
+-; CHECK-NOT: 0x0000000000000000      7      0      1   0  is_stmt
+-; CHECK: 0x0000000000000000      7      0      1   0
++; CHECK: 0x0000000000000000      7      0      1   0  is_stmt
+ ; CHECK: 0x0000000000000004      8     18      1   0  is_stmt prologue_end
+ 
+ define i32 @callee(i32 %x) nounwind uwtable ssp {
+ entry:
+   %x.addr = alloca i32, align 4
+   %y = alloca i32, align 4





More information about the vmkit-commits mailing list