New tests for the 'case' expression: not_empty, in_language.
authorMikhail Glushenkov <foldr@codedgers.com>
Fri, 30 May 2008 06:19:52 +0000 (06:19 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Fri, 30 May 2008 06:19:52 +0000 (06:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51744 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvmc2/AutoGenerated.cpp
tools/llvmc2/AutoGenerated.h
tools/llvmc2/Common.td
tools/llvmc2/CompilationGraph.cpp
tools/llvmc2/CompilationGraph.h
tools/llvmc2/Tools.td
tools/llvmc2/examples/Clang.td
utils/TableGen/LLVMCConfigurationEmitter.cpp

index e240fee1590aef4ba989bd70e7209aebe844e185..2bd624afccc08b854b15907fec62d06303e434ff 100644 (file)
 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"
index 3b65256e0a55655496eda2264ea325367adb83c8..106a04ef845ff6f386fc9daa8df1b07a07155ec8 100644 (file)
@@ -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);
index 364cac3549402cc543ad5eb5678e66f6f0432bd7..a7515b8f0f27e9a4834a1be47d88c6ddda3c7c2a 100644 (file)
@@ -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.
index 92f3104c018a894605d63fa5289227d6d42487f9..cf174dd56f3274a325a539cff48d139a193f093c 100644 (file)
@@ -32,6 +32,19 @@ extern cl::list<std::string> InputFilenames;
 extern cl::opt<std::string> OutputFilename;
 extern cl::list<std::string> 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);
index 41731a3f8902537c5dc0d100eb69e055739e12ab..7dfe78fd2ded570eb82939cff175d6f995e121f7 100644 (file)
@@ -111,8 +111,6 @@ namespace llvmc {
     llvm::SmallVector<llvm::IntrusiveRefCntPtr<Edge>, 3> tools_vector_type;
     typedef llvm::StringMap<tools_vector_type> 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.
index 0e3faa3990a67464c5dc7c6efd27791b85976fd4..28fba8d5a36097c2a46137b7c5e73b5d6bdc1cf7 100644 (file)
@@ -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")),
index bc9342d9797a02420e08e4eb64deca9f8937df0c..f57c7266a34538f823a97f215c8eaf9a3111ad28 100644 (file)
@@ -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)
index 68548d62b7c852c41eea3cf36a971c3f116ee63e..0b6e8d7f34c03182945e9f8d3832f33c6f559445 100644 (file)
@@ -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