diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-06-12 18:01:31 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-06-12 18:01:31 +0000 | 
| commit | bd5abe19687421cb3ad4dca066732ed0b437531b (patch) | |
| tree | a9b264321873e7d25e69b8671c9f705ebc6d30ee /contrib/llvm/utils/TableGen/TableGen.cpp | |
| parent | 74d92904a6e0f2d301cdeec3f8af4fbe4a968146 (diff) | |
| parent | 56fe8f14099930935e3870e3e823c322a85c1c89 (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/utils/TableGen/TableGen.cpp')
| -rw-r--r-- | contrib/llvm/utils/TableGen/TableGen.cpp | 113 | 
1 files changed, 73 insertions, 40 deletions
diff --git a/contrib/llvm/utils/TableGen/TableGen.cpp b/contrib/llvm/utils/TableGen/TableGen.cpp index aa9230252421..4e4da366ae07 100644 --- a/contrib/llvm/utils/TableGen/TableGen.cpp +++ b/contrib/llvm/utils/TableGen/TableGen.cpp @@ -37,6 +37,7 @@  #include "RegisterInfoEmitter.h"  #include "ARMDecoderEmitter.h"  #include "SubtargetEmitter.h" +#include "SetTheory.h"  #include "TGParser.h"  #include "llvm/ADT/OwningPtr.h"  #include "llvm/Support/CommandLine.h" @@ -80,7 +81,8 @@ enum ActionType {    GenArmNeon,    GenArmNeonSema,    GenArmNeonTest, -  PrintEnums +  PrintEnums, +  PrintSets  };  namespace { @@ -162,6 +164,8 @@ namespace {                                 "Generate ARM NEON tests for clang"),                      clEnumValN(PrintEnums, "print-enums",                                 "Print enum values for a class"), +                    clEnumValN(PrintSets, "print-sets", +                               "Print expanded sets for testing DAG exprs"),                      clEnumValEnd));    cl::opt<std::string> @@ -173,6 +177,10 @@ namespace {                   cl::init("-"));    cl::opt<std::string> +  DependFilename("d", cl::desc("Dependency filename"), cl::value_desc("filename"), +                 cl::init("")); + +  cl::opt<std::string>    InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));    cl::list<std::string> @@ -192,34 +200,6 @@ void llvm::PrintError(SMLoc ErrorLoc, const Twine &Msg) {    SrcMgr.PrintMessage(ErrorLoc, Msg, "error");  } - - -/// ParseFile - this function begins the parsing of the specified tablegen -/// file. -static bool ParseFile(const std::string &Filename, -                      const std::vector<std::string> &IncludeDirs, -                      SourceMgr &SrcMgr, -                      RecordKeeper &Records) { -  OwningPtr<MemoryBuffer> File; -  if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), File)) { -    errs() << "Could not open input file '" << Filename << "': " -           << ec.message() <<"\n"; -    return true; -  } -  MemoryBuffer *F = File.take(); - -  // Tell SrcMgr about this buffer, which is what TGParser will pick up. -  SrcMgr.AddNewSourceBuffer(F, SMLoc()); - -  // Record the location of the include directory so that the lexer can find -  // it later. -  SrcMgr.setIncludeDirs(IncludeDirs); - -  TGParser Parser(SrcMgr, Records); - -  return Parser.ParseFile(); -} -  int main(int argc, char **argv) {    RecordKeeper Records; @@ -228,19 +208,57 @@ int main(int argc, char **argv) {    cl::ParseCommandLineOptions(argc, argv); -  // Parse the input file. -  if (ParseFile(InputFilename, IncludeDirs, SrcMgr, Records)) -    return 1; +  try { +    // Parse the input file. +    OwningPtr<MemoryBuffer> File; +    if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename.c_str(), File)) { +      errs() << "Could not open input file '" << InputFilename << "': " +             << ec.message() <<"\n"; +      return 1; +    } +    MemoryBuffer *F = File.take(); -  std::string Error; -  tool_output_file Out(OutputFilename.c_str(), Error); -  if (!Error.empty()) { -    errs() << argv[0] << ": error opening " << OutputFilename -           << ":" << Error << "\n"; -    return 1; -  } +    // Tell SrcMgr about this buffer, which is what TGParser will pick up. +    SrcMgr.AddNewSourceBuffer(F, SMLoc()); + +    // Record the location of the include directory so that the lexer can find +    // it later. +    SrcMgr.setIncludeDirs(IncludeDirs); + +    TGParser Parser(SrcMgr, Records); + +    if (Parser.ParseFile()) +      return 1; + +    std::string Error; +    tool_output_file Out(OutputFilename.c_str(), Error); +    if (!Error.empty()) { +      errs() << argv[0] << ": error opening " << OutputFilename +        << ":" << Error << "\n"; +      return 1; +    } +    if (!DependFilename.empty()) { +      if (OutputFilename == "-") { +        errs() << argv[0] << ": the option -d must be used together with -o\n"; +        return 1; +      } +      tool_output_file DepOut(DependFilename.c_str(), Error); +      if (!Error.empty()) { +        errs() << argv[0] << ": error opening " << DependFilename +          << ":" << Error << "\n"; +        return 1; +      } +      DepOut.os() << DependFilename << ":"; +      const std::vector<std::string> &Dependencies = Parser.getDependencies(); +      for (std::vector<std::string>::const_iterator I = Dependencies.begin(), +                                                          E = Dependencies.end(); +           I != E; ++I) { +        DepOut.os() << " " << (*I); +      } +      DepOut.os() << "\n"; +      DepOut.keep(); +    } -  try {      switch (Action) {      case PrintRecords:        Out.os() << Records;           // No argument, dump all contents @@ -360,6 +378,21 @@ int main(int argc, char **argv) {        Out.os() << "\n";        break;      } +    case PrintSets: +    { +      SetTheory Sets; +      Sets.addFieldExpander("Set", "Elements"); +      std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set"); +      for (unsigned i = 0, e = Recs.size(); i != e; ++i) { +        Out.os() << Recs[i]->getName() << " = ["; +        const std::vector<Record*> *Elts = Sets.expand(Recs[i]); +        assert(Elts && "Couldn't expand Set instance"); +        for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei) +          Out.os() << ' ' << (*Elts)[ei]->getName(); +        Out.os() << " ]\n"; +      } +      break; +    }      default:        assert(1 && "Invalid Action");        return 1;  | 
