xref: /llvm-project/llvm/lib/TableGen/Parser.cpp (revision e03f427196ec67a8a5cfbdd658f9eabe9bce83ce)
1e865fa75SRiver Riddle //===- Parser.cpp - Top-Level TableGen Parser implementation --------------===//
2e865fa75SRiver Riddle //
3e865fa75SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e865fa75SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5e865fa75SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e865fa75SRiver Riddle //
7e865fa75SRiver Riddle //===----------------------------------------------------------------------===//
8e865fa75SRiver Riddle 
9e865fa75SRiver Riddle #include "llvm/TableGen/Parser.h"
10e865fa75SRiver Riddle #include "TGParser.h"
11e865fa75SRiver Riddle #include "llvm/Support/MemoryBuffer.h"
12e865fa75SRiver Riddle #include "llvm/TableGen/Record.h"
13e865fa75SRiver Riddle 
14e865fa75SRiver Riddle using namespace llvm;
15e865fa75SRiver Riddle 
165a9a438aSRiver Riddle bool llvm::TableGenParseFile(SourceMgr &InputSrcMgr, RecordKeeper &Records) {
175a9a438aSRiver Riddle   // Initialize the global TableGen source manager by temporarily taking control
185a9a438aSRiver Riddle   // of the input buffer in `SrcMgr`. This is kind of a hack, but allows for
195a9a438aSRiver Riddle   // preserving TableGen's current awkward diagnostic behavior. If we can remove
205a9a438aSRiver Riddle   // this reliance, we could drop all of this.
21d60a65abSDavid Blaikie   SrcMgr = SourceMgr();
225a9a438aSRiver Riddle   SrcMgr.takeSourceBuffersFrom(InputSrcMgr);
235a9a438aSRiver Riddle   SrcMgr.setIncludeDirs(InputSrcMgr.getIncludeDirs());
245a9a438aSRiver Riddle   SrcMgr.setDiagHandler(InputSrcMgr.getDiagHandler(),
255a9a438aSRiver Riddle                         InputSrcMgr.getDiagContext());
265a9a438aSRiver Riddle 
275a9a438aSRiver Riddle   // Setup the record keeper and try to parse the file.
285a9a438aSRiver Riddle   auto *MainFileBuffer = SrcMgr.getMemoryBuffer(SrcMgr.getMainFileID());
295a9a438aSRiver Riddle   Records.saveInputFilename(MainFileBuffer->getBufferIdentifier().str());
305a9a438aSRiver Riddle 
31*e03f4271SJay Foad   TGParser Parser(SrcMgr, /*Macros=*/{}, Records,
321e6905f1SRiver Riddle                   /*NoWarnOnUnusedTemplateArgs=*/false,
331e6905f1SRiver Riddle                   /*TrackReferenceLocs=*/true);
345a9a438aSRiver Riddle   bool ParseResult = Parser.ParseFile();
35e865fa75SRiver Riddle 
365a9a438aSRiver Riddle   // After parsing, reclaim the source manager buffers from TableGen's global
375a9a438aSRiver Riddle   // manager.
385a9a438aSRiver Riddle   InputSrcMgr.takeSourceBuffersFrom(SrcMgr);
39e865fa75SRiver Riddle   SrcMgr = SourceMgr();
405a9a438aSRiver Riddle   return ParseResult;
41e865fa75SRiver Riddle }
42