diff --git a/tools/llvmc/CompilerDriver.cpp b/tools/llvmc/CompilerDriver.cpp index e7addf86e4e..39a29899261 100644 --- a/tools/llvmc/CompilerDriver.cpp +++ b/tools/llvmc/CompilerDriver.cpp @@ -249,6 +249,14 @@ private: } else found = false; break; + case 'b': + if (*PI == "%bindir%") { + std::string tmp(*PI); + tmp.replace(0,8,LLVM_BINDIR); + action->args.push_back(tmp); + } else + found = false; + break; case 'd': if (*PI == "%defs%") { StringVector::iterator I = Defines.begin(); @@ -282,13 +290,35 @@ private: found = false; break; case 'l': - if (*PI == "%libs%") { + if ((*PI)[1] == 'l') { + std::string tmp(*PI); + if (*PI == "%llvmgccdir%") + tmp.replace(0,12,LLVMGCCDIR); + else if (*PI == "%llvmgccarch%") + tmp.replace(0,13,LLVMGCCARCH); + else if (*PI == "%llvmgcc%") + tmp.replace(0,9,LLVMGCC); + else if (*PI == "%llvmgxx%") + tmp.replace(0,9,LLVMGXX); + else if (*PI == "%llvmcc1%") + tmp.replace(0,9,LLVMCC1); + else if (*PI == "%llvmcc1plus%") + tmp.replace(0,9,LLVMCC1); + else + found = false; + if (found) + action->args.push_back(tmp); + } else if (*PI == "%libs%") { PathVector::iterator I = LibraryPaths.begin(); PathVector::iterator E = LibraryPaths.end(); while (I != E) { action->args.push_back( std::string("-L") + I->toString() ); ++I; } + } else if (*PI == "%libdir%") { + std::string tmp(*PI); + tmp.replace(0,8,LLVM_LIBDIR); + action->args.push_back(tmp); } else found = false; break; @@ -896,6 +926,8 @@ private: CompilerDriver::~CompilerDriver() { } +CompilerDriver::ConfigDataProvider::~ConfigDataProvider() {} + CompilerDriver* CompilerDriver::Get(ConfigDataProvider& CDP) { return new CompilerDriverImpl(CDP); diff --git a/tools/llvmc/CompilerDriver.h b/tools/llvmc/CompilerDriver.h index 6f9d0f497ac..1100e3e46f8 100644 --- a/tools/llvmc/CompilerDriver.h +++ b/tools/llvmc/CompilerDriver.h @@ -110,6 +110,7 @@ namespace llvm { /// @brief Configuration Data Provider interface class ConfigDataProvider { public: + virtual ~ConfigDataProvider(); virtual ConfigData* ProvideConfigData(const std::string& filetype) = 0; virtual void setConfigDir(const sys::Path& dirName) = 0; }; diff --git a/tools/llvmc/ConfigLexer.h b/tools/llvmc/ConfigLexer.h index 8d8205e18fe..3e87fc1a58a 100644 --- a/tools/llvmc/ConfigLexer.h +++ b/tools/llvmc/ConfigLexer.h @@ -48,53 +48,61 @@ class InputProvider { extern InputProvider* ConfigLexerInput; enum ConfigLexerTokens { - EOFTOK = 0, ///< Returned by Configlex when we hit end of file - EOLTOK, ///< End of line - ERRORTOK, ///< Error token - ARGS_SUBST, ///< THe substitution item %args% - ASSEMBLY, ///< The value "assembly" (and variants) - ASSEMBLER, ///< The name "assembler" (and variants) - BYTECODE, ///< The value "bytecode" (and variants) - COMMAND, ///< The name "command" (and variants) - DEFS_SUBST, ///< The substitution item %defs% - EQUALS, ///< The equals sign, = - FALSETOK, ///< A boolean false value (false/no/off) - FOPTS_SUBST, ///< The substitution item %fOpts% - IN_SUBST, ///< The substitution item %in% - INCLS_SUBST, ///< The substitution item %incls% - INTEGER, ///< An integer - LANG, ///< The name "lang" (and variants) - LIBPATHS, ///< The name "libpaths" (and variants) - LIBS, ///< The name "libs" (and variants) - LIBS_SUBST, ///< The substitution item %libs% - LINKER, ///< The name "linker" (and variants) - MOPTS_SUBST, ///< The substitution item %Mopts% - NAME, ///< The name "name" (and variants) - OPT_SUBST, ///< The substitution item %opt% - OPTIMIZER, ///< The name "optimizer" (and variants) - OPTION, ///< A command line option - OPT1, ///< The name "opt1" (and variants) - OPT2, ///< The name "opt2" (and variants) - OPT3, ///< The name "opt3" (and variants) - OPT4, ///< The name "opt4" (and variants) - OPT5, ///< The name "opt5" (and variants) - OUT_SUBST, ///< The output substitution item %out% - OUTPUT, ///< The name "output" (and variants) - PREPROCESSES, ///< The name "preprocesses" (and variants) - PREPROCESSOR, ///< The name "preprocessor" (and variants) - REQUIRED, ///< The name "required" (and variants) - SEPARATOR, ///< A configuration item separator - SPACE, ///< Space between options - STATS_SUBST, ///< The stats substitution item %stats% - STRING, ///< A quoted string - TARGET_SUBST, ///< The substitition item %target% - TIME_SUBST, ///< The substitution item %time% - TRANSLATES, ///< The name "translates" (and variants) - TRANSLATOR, ///< The name "translator" (and variants) - TRUETOK, ///< A boolean true value (true/yes/on) - VERBOSE_SUBST,///< The substitution item %verbose% - VERSION_TOK, ///< The name "version" (and variants) - WOPTS_SUBST, ///< The %WOpts% substitution + EOFTOK = 0, ///< Returned by Configlex when we hit end of file + EOLTOK, ///< End of line + ERRORTOK, ///< Error token + ARGS_SUBST, ///< The substitution item %args% + BINDIR_SUBST, ///< The substitution item %bindir% + ASSEMBLY, ///< The value "assembly" (and variants) + ASSEMBLER, ///< The name "assembler" (and variants) + BYTECODE, ///< The value "bytecode" (and variants) + COMMAND, ///< The name "command" (and variants) + DEFS_SUBST, ///< The substitution item %defs% + EQUALS, ///< The equals sign, = + FALSETOK, ///< A boolean false value (false/no/off) + FOPTS_SUBST, ///< The substitution item %fOpts% + IN_SUBST, ///< The substitution item %in% + INCLS_SUBST, ///< The substitution item %incls% + INTEGER, ///< An integer + LANG, ///< The name "lang" (and variants) + LIBDIR_SUBST, ///< The substitution item %libdir% + LIBPATHS, ///< The name "libpaths" (and variants) + LIBS, ///< The name "libs" (and variants) + LIBS_SUBST, ///< The substitution item %libs% + LINKER, ///< The name "linker" (and variants) + LLVMGCCDIR_SUBST, ///< The substitution item %llvmgccdir% + LLVMGCCARCH_SUBST, ///< The substitution item %llvmgccarch% + LLVMGCC_SUBST, ///< The substitution item %llvmgcc% + LLVMGXX_SUBST, ///< The substitution item %llvmgxx% + LLVMCC1_SUBST, ///< The substitution item %llvmcc1% + LLVMCC1PLUS_SUBST, ///< The substitution item %llvmcc1plus% + MOPTS_SUBST, ///< The substitution item %Mopts% + NAME, ///< The name "name" (and variants) + OPT_SUBST, ///< The substitution item %opt% + OPTIMIZER, ///< The name "optimizer" (and variants) + OPTION, ///< A command line option + OPT1, ///< The name "opt1" (and variants) + OPT2, ///< The name "opt2" (and variants) + OPT3, ///< The name "opt3" (and variants) + OPT4, ///< The name "opt4" (and variants) + OPT5, ///< The name "opt5" (and variants) + OUT_SUBST, ///< The output substitution item %out% + OUTPUT, ///< The name "output" (and variants) + PREPROCESSES, ///< The name "preprocesses" (and variants) + PREPROCESSOR, ///< The name "preprocessor" (and variants) + REQUIRED, ///< The name "required" (and variants) + SEPARATOR, ///< A configuration item separator + SPACE, ///< Space between options + STATS_SUBST, ///< The stats substitution item %stats% + STRING, ///< A quoted string + TARGET_SUBST, ///< The substitition item %target% + TIME_SUBST, ///< The substitution item %time% + TRANSLATES, ///< The name "translates" (and variants) + TRANSLATOR, ///< The name "translator" (and variants) + TRUETOK, ///< A boolean true value (true/yes/on) + VERBOSE_SUBST, ///< The substitution item %verbose% + VERSION_TOK, ///< The name "version" (and variants) + WOPTS_SUBST, ///< The %WOpts% substitution }; extern ConfigLexerTokens Configlex(); diff --git a/tools/llvmc/ConfigLexer.l b/tools/llvmc/ConfigLexer.l index f65428ecd66..ca21f4f64d2 100644 --- a/tools/llvmc/ConfigLexer.l +++ b/tools/llvmc/ConfigLexer.l @@ -163,10 +163,18 @@ White [ \t]* {LINKER} { return handleNameContext(LINKER); } %args% { return handleSubstitution(ARGS_SUBST); } +%bindir% { return handleSubstitution(BINDIR_SUBST); } %defs% { return handleSubstitution(DEFS_SUBST); } %in% { return handleSubstitution(IN_SUBST); } %incls% { return handleSubstitution(INCLS_SUBST); } +%libdir% { return handleSubstitution(LIBDIR_SUBST); } %libs% { return handleSubstitution(LIBS_SUBST); } +%llvmgccdir% { return handleSubstitution(LLVMGCCDIR_SUBST); } +%llvmgccarch% { return handleSubstitution(LLVMGCCARCH_SUBST); } +%llvmgcc% { return handleSubstitution(LLVMGCC_SUBST); } +%llvmgxx% { return handleSubstitution(LLVMGXX_SUBST); } +%llvmcc1% { return handleSubstitution(LLVMCC1_SUBST); } +%llvmcc1plus% { return handleSubstitution(LLVMCC1PLUS_SUBST); } %opt% { return handleSubstitution(OPT_SUBST); } %out% { return handleSubstitution(OUT_SUBST); } %stats% { return handleSubstitution(STATS_SUBST); } diff --git a/tools/llvmc/Configuration.cpp b/tools/llvmc/Configuration.cpp index 2abf651d702..3b9d221fe35 100644 --- a/tools/llvmc/Configuration.cpp +++ b/tools/llvmc/Configuration.cpp @@ -167,9 +167,11 @@ namespace { bool parseSubstitution(CompilerDriver::StringVector& optList) { switch (token) { case ARGS_SUBST: optList.push_back("%args%"); break; + case BINDIR_SUBST: optList.push_back("%bindir%"); break; case DEFS_SUBST: optList.push_back("%defs%"); break; case IN_SUBST: optList.push_back("%in%"); break; case INCLS_SUBST: optList.push_back("%incls%"); break; + case LIBDIR_SUBST: optList.push_back("%libdir%"); break; case LIBS_SUBST: optList.push_back("%libs%"); break; case OPT_SUBST: optList.push_back("%opt%"); break; case OUT_SUBST: optList.push_back("%out%"); break; diff --git a/tools/llvmc/Makefile b/tools/llvmc/Makefile index 29ec6d9326a..d4b6275ce82 100644 --- a/tools/llvmc/Makefile +++ b/tools/llvmc/Makefile @@ -9,14 +9,27 @@ LEVEL = ../.. TOOLNAME = llvmc USEDLIBS = LLVMBCReader LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a -CONFIG_FILES = c cpp ll st -EXTRA_DIST = c cpp ll st +CONFIG_FILES = c cpp ll +EXTRA_DIST = c cpp ll + +# The CompilerDriver needs to know the locations of several configured +# directories and paths. We define these as preprocessor symbols so they can +# be hard coded into the process based on the configuration. Only those +# configuration values not available in llvm/include/Config/config.h need to be +# specified here. These values are used as the replacements for the +# configuration file substitution variables such as %llvmgccdir% +CPPFLAGS = -DLLVMGCCDIR="\"$(LLVMGCCDIR)\"" \ + -DLLVMGCCARCH="\"$(LLVMGCCARCH)\"" \ + -DLLVMGCC="\"$(LLVMGCC)\"" \ + -DLLVMGXX="\"$(LLVMGXX)\"" \ + -DLLVMCC1="\"$(LLVMCC1)\"" \ + -DLLVMCC1PLUS="$(LLVMCC1PLUS)" include $(LEVEL)/Makefile.common install:: $(Echo) Installing additional C++ configuration clones - $(Verb)$(DataInstall) $(PROJ_OBJ_DIR)/cpp $(PROJ_etcdir)/cc - $(Verb)$(DataInstall) $(PROJ_OBJ_DIR)/cpp $(PROJ_etcdir)/c++ - $(Verb)$(DataInstall) $(PROJ_OBJ_DIR)/cpp $(PROJ_etcdir)/cxx - $(Verb)$(DataInstall) $(PROJ_OBJ_DIR)/cpp $(PROJ_etcdir)/C + $(Verb)$(DataInstall) $(PROJ_SRC_DIR)/cpp $(PROJ_etcdir)/cc + $(Verb)$(DataInstall) $(PROJ_SRC_DIR)/cpp $(PROJ_etcdir)/c++ + $(Verb)$(DataInstall) $(PROJ_SRC_DIR)/cpp $(PROJ_etcdir)/cxx + $(Verb)$(DataInstall) $(PROJ_SRC_DIR)/cpp $(PROJ_etcdir)/C diff --git a/tools/llvmc/c.in b/tools/llvmc/c similarity index 84% rename from tools/llvmc/c.in rename to tools/llvmc/c index d1d151c9c8c..cbe6830b93d 100644 --- a/tools/llvmc/c.in +++ b/tools/llvmc/c @@ -9,8 +9,8 @@ lang.opt3=-O3 lang.opt4=-O3 lang.opt5=-O3 - lang.libs=@LLVMGCCDIR@/lib @LLVMGCCDIR@/lib \ - @LLVMGCCDIR@/lib/gcc/@LLVMGCCARCH@ + lang.libs=%llvmgccdir%/lib %llvmgccdir%/lib \ + %llvmgccdir%/lib/gcc/%llvmgccarch% ########################################################## # Pre-processor definitions @@ -25,7 +25,7 @@ ########################################################## # To compile C source, just use llvm-gcc's cc1 - translator.command=@LLVMCC1@ -quiet %in% -o %out% \ + translator.command=%llvmcc1% -quiet %in% -o %out% \ %opt% %incls% %defs% %WOpts% %fOpts% %MOpts% %args% \ -D_GNU_SOURCE @@ -43,7 +43,7 @@ ########################################################## # Use gccas to clean up the generated code - optimizer.command=@LLVM_BINDIR@/gccas %in% -o %out% %args% + optimizer.command=%bindir%/gccas %in% -o %out% %args% optimizer.required = true # gccas doesn't translate @@ -58,4 +58,4 @@ ########################################################## # Assembler definitions ########################################################## - assembler.command=@LLVM_BINDIR@/llc %in% -o %out% %target% %time% %stats% + assembler.command=%bindir%/llc %in% -o %out% %target% %time% %stats% diff --git a/tools/llvmc/cpp.in b/tools/llvmc/cpp similarity index 84% rename from tools/llvmc/cpp.in rename to tools/llvmc/cpp index a065f9c3bc1..5f20fd8d4d9 100644 --- a/tools/llvmc/cpp.in +++ b/tools/llvmc/cpp @@ -9,8 +9,8 @@ lang.opt3=-O3 lang.opt4=-O3 lang.opt5=-O3 - lang.libs=@LLVMGCCDIR@/lib @LLVMGCCDIR@/lib \ - @LLVMGCCDIR@/lib/gcc/@LLVMGCCARCH@ + lang.libs=%llvmgccdir%/lib %llvmgccdir%/lib \ + %llvmgccdir%/lib/gcc/%llvmgccarch% ########################################################## # Pre-processor definitions @@ -25,7 +25,7 @@ ########################################################## # To compile C++ source, just use llvm-g++'s cc1 - translator.command=@LLVMCC1PLUS@ -quiet %in% -o %out% \ + translator.command=%llvmcc1plus% -quiet %in% -o %out% \ %opt% %incls% %defs% %WOpts% %fOpts% %MOpts% %args% \ -D_GNU_SOURCE @@ -43,7 +43,7 @@ ########################################################## # Use gccas to clean up the generated code - optimizer.command=@LLVM_BINDIR@/gccas %in% -o %out% %args% + optimizer.command=%bindir%/gccas %in% -o %out% %args% optimizer.required = true # gccas doesn't translate @@ -58,4 +58,4 @@ ########################################################## # Assembler definitions ########################################################## - assembler.command=@LLVM_BINDIR@/llc %in% -o %out% %target% %time% %stats% + assembler.command=%bindir%/llc %in% -o %out% %target% %time% %stats% diff --git a/tools/llvmc/ll.in b/tools/llvmc/ll similarity index 60% rename from tools/llvmc/ll.in rename to tools/llvmc/ll index c6567a37c70..9c5146ca21d 100644 --- a/tools/llvmc/ll.in +++ b/tools/llvmc/ll @@ -3,10 +3,10 @@ lang.name=LLVM Assembly preprocessor.command= preprocessor.required=false - translator.command=@bindir@/llvm-as %in% -o %out% + translator.command=%bindir%/llvm-as %in% -o %out% translator.optimizes=no translator.preprocesses=true translator.required=TRUE - optimizer.command=@bindir@/opt %in% -o %out% %opt% %args% + optimizer.command=%bindir%/opt %in% -o %out% %opt% %args% optimizer.translates=no - assembler.command=@bindir@/llc %in% -o %out% + assembler.command=%bindir%/llc %in% -o %out%