From: Mikhail Glushenkov Date: Fri, 30 May 2008 06:19:52 +0000 (+0000) Subject: New tests for the 'case' expression: not_empty, in_language. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2e73e851d8a4b5abea990011c201dc391e5e04c1;p=oota-llvm.git New tests for the 'case' expression: not_empty, in_language. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51744 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvmc2/AutoGenerated.cpp b/tools/llvmc2/AutoGenerated.cpp index e240fee1590..2bd624afccc 100644 --- a/tools/llvmc2/AutoGenerated.cpp +++ b/tools/llvmc2/AutoGenerated.cpp @@ -24,5 +24,10 @@ using namespace llvm; using namespace llvmc; +namespace llvmc { + extern LanguageMap GlobalLanguageMap; + extern const std::string& GetLanguage(const sys::Path& File); +} + // The auto-generated file #include "AutoGenerated.inc" diff --git a/tools/llvmc2/AutoGenerated.h b/tools/llvmc2/AutoGenerated.h index 3b65256e0a5..106a04ef845 100644 --- a/tools/llvmc2/AutoGenerated.h +++ b/tools/llvmc2/AutoGenerated.h @@ -25,7 +25,7 @@ namespace llvmc { /// PopulateLanguageMap - The auto-generated function that fills in /// the language map (map from file extensions to language names). - void PopulateLanguageMap(LanguageMap& language_map); + void PopulateLanguageMap(); /// PopulateCompilationGraph - The auto-generated function that /// populates the compilation graph with nodes and edges. void PopulateCompilationGraph(CompilationGraph& tools); diff --git a/tools/llvmc2/Common.td b/tools/llvmc2/Common.td index 364cac35494..a7515b8f0f2 100644 --- a/tools/llvmc2/Common.td +++ b/tools/llvmc2/Common.td @@ -56,6 +56,8 @@ def switch_on; def parameter_equals; def element_in_list; def input_languages_contain; +def not_empty; +// TOTHINK: remove? def default; // Boolean operators. diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp index 92f3104c018..cf174dd56f3 100644 --- a/tools/llvmc2/CompilationGraph.cpp +++ b/tools/llvmc2/CompilationGraph.cpp @@ -32,6 +32,19 @@ extern cl::list InputFilenames; extern cl::opt OutputFilename; extern cl::list Languages; +namespace llvmc { + /// ExtsToLangs - Map from file extensions to language names. + LanguageMap GlobalLanguageMap; + + /// GetLanguage - Find the language name corresponding to the given file. + const std::string& GetLanguage(const sys::Path& File) { + LanguageMap::const_iterator Lang = GlobalLanguageMap.find(File.getSuffix()); + if (Lang == GlobalLanguageMap.end()) + throw std::runtime_error("Unknown suffix: " + File.getSuffix()); + return Lang->second; + } +} + namespace { /// ChooseEdge - Return the edge with the maximum weight. @@ -87,14 +100,6 @@ const Node& CompilationGraph::getNode(const std::string& ToolName) const { return I->second; } -// Find the language name corresponding to the given file. -const std::string& CompilationGraph::getLanguage(const sys::Path& File) const { - LanguageMap::const_iterator Lang = ExtsToLangs.find(File.getSuffix()); - if (Lang == ExtsToLangs.end()) - throw std::runtime_error("Unknown suffix: " + File.getSuffix()); - return Lang->second; -} - // Find the tools list corresponding to the given language name. const CompilationGraph::tools_vector_type& CompilationGraph::getToolsVector(const std::string& LangName) const @@ -200,7 +205,7 @@ FindToolChain(const sys::Path& In, const std::string* forceLanguage, // Determine the input language. const std::string& InLanguage = - forceLanguage ? *forceLanguage : getLanguage(In); + forceLanguage ? *forceLanguage : GetLanguage(In); // Add the current input language to the input language set. InLangs.insert(InLanguage); diff --git a/tools/llvmc2/CompilationGraph.h b/tools/llvmc2/CompilationGraph.h index 41731a3f890..7dfe78fd2de 100644 --- a/tools/llvmc2/CompilationGraph.h +++ b/tools/llvmc2/CompilationGraph.h @@ -111,8 +111,6 @@ namespace llvmc { llvm::SmallVector, 3> tools_vector_type; typedef llvm::StringMap tools_map_type; - /// ExtsToLangs - Map from file extensions to language names. - LanguageMap ExtsToLangs; /// ToolsMap - Map from language names to lists of tool names. tools_map_type ToolsMap; /// NodesMap - Map from tool names to Tool objects. @@ -134,7 +132,7 @@ namespace llvmc { /// options are passed implicitly as global variables. int Build(llvm::sys::Path const& tempDir); - /// getNode -Return a reference to the node correponding to the + /// getNode - Return a reference to the node correponding to the /// given tool name. Throws std::runtime_error. Node& getNode(const std::string& ToolName); const Node& getNode(const std::string& ToolName) const; @@ -152,15 +150,10 @@ namespace llvmc { // GraphTraits support. friend NodesIterator GraphBegin(CompilationGraph*); friend NodesIterator GraphEnd(CompilationGraph*); - friend void PopulateCompilationGraph(CompilationGraph&); private: // Helper functions. - /// getLanguage - Find out which language corresponds to the - /// suffix of this file. - const std::string& getLanguage(const llvm::sys::Path& File) const; - /// getToolsVector - Return a reference to the list of tool names /// corresponding to the given language name. Throws /// std::runtime_error. diff --git a/tools/llvmc2/Tools.td b/tools/llvmc2/Tools.td index 0e3faa3990a..28fba8d5a36 100644 --- a/tools/llvmc2/Tools.td +++ b/tools/llvmc2/Tools.td @@ -41,6 +41,7 @@ def llvm_gcc_cpp : Tool< (output_suffix "bc"), (cmd_line (case (switch_on "E"), + // TOFIX: this does not play well with -o "llvm-g++ -E -x c++ $INFILE", (default), "llvm-g++ -c -x c++ $INFILE -o $OUTFILE -emit-llvm")), diff --git a/tools/llvmc2/examples/Clang.td b/tools/llvmc2/examples/Clang.td index bc9342d9797..f57c7266a34 100644 --- a/tools/llvmc2/examples/Clang.td +++ b/tools/llvmc2/examples/Clang.td @@ -8,9 +8,13 @@ def clang : Tool< [(in_language ["c", "c++", "objective-c"]), (out_language "llvm-bitcode"), (output_suffix "bc"), - // TOFIX: We should be able to test the language of the input file (cmd_line (case (switch_on "E"), "clang -E $INFILE", - (default), "clang -emit-llvm-bc $INFILE -o $OUTFILE")), + (in_language "c"), + "clang -emit-llvm-bc -x c $INFILE -o $OUTFILE", + (in_language "c++"), + "clang -emit-llvm-bc -x c++ $INFILE -o $OUTFILE", + (in_language "objective-c"), + "clang -emit-llvm-bc -x objective-c$INFILE -o $OUTFILE")), (switch_option "E", (stop_compilation), (output_suffix "i"), (help "Stop after the preprocessing stage, do not run the compiler")), (sink) diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index 68548d62b7c..0b6e8d7f34c 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -667,6 +667,16 @@ bool EmitCaseTest1Arg(const std::string& TestName, } else if (TestName == "input_languages_contain") { O << "InLangs.count(\"" << OptName << "\") != 0"; return true; + } else if (TestName == "in_language") { + // Works only for cmd_line! + O << "GetLanguage(inFile) == \"" << OptName << '\"'; + return true; + } else if (TestName == "not_empty") { + const GlobalOptionDescription& OptDesc = OptDescs.FindOption(OptName); + if (OptDesc.Type == OptionType::Switch) + throw OptName + ": incorrect option type!"; + O << '!' << OptDesc.GenVariableName() << ".empty()"; + return true; } return false; @@ -1026,7 +1036,7 @@ void EmitGenerateActionMethod (const ToolProperties& P, else EmitCaseConstructHandler(&InitPtrToDag(P.CmdLine), Indent2, EmitCmdLineVecFillCallback(Version, P.Name), - true, OptDescs, O); + false, OptDescs, O); // For every understood option, emit handling code. for (ToolOptionDescriptions::const_iterator B = P.OptDescs.begin(), @@ -1222,7 +1232,7 @@ void EmitPopulateLanguageMap (const RecordKeeper& Records, std::ostream& O) throw std::string("Error in the language map definition!"); // Generate code - O << "void llvmc::PopulateLanguageMap(LanguageMap& language_map) {\n"; + O << "void llvmc::PopulateLanguageMap() {\n"; for (unsigned i = 0; i < LangsToSuffixesList->size(); ++i) { Record* LangToSuffixes = LangsToSuffixesList->getElementAsRecord(i); @@ -1231,7 +1241,7 @@ void EmitPopulateLanguageMap (const RecordKeeper& Records, std::ostream& O) const ListInit* Suffixes = LangToSuffixes->getValueAsListInit("suffixes"); for (unsigned i = 0; i < Suffixes->size(); ++i) - O << Indent1 << "language_map[\"" + O << Indent1 << "GlobalLanguageMap[\"" << InitPtrToString(Suffixes->getElement(i)) << "\"] = \"" << Lang << "\";\n"; } @@ -1360,7 +1370,7 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph, // Generate code O << "void llvmc::PopulateCompilationGraph(CompilationGraph& G) {\n" - << Indent1 << "PopulateLanguageMap(G.ExtsToLangs);\n\n"; + << Indent1 << "PopulateLanguageMap();\n\n"; // Insert vertices