//===- Parser.cpp - Top-Level TableGen Parser implementation --------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/TableGen/Parser.h" #include "TGParser.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/TableGen/Record.h" using namespace llvm; bool llvm::TableGenParseFile(SourceMgr &InputSrcMgr, RecordKeeper &Records) { // Initialize the global TableGen source manager by temporarily taking control // of the input buffer in `SrcMgr`. This is kind of a hack, but allows for // preserving TableGen's current awkward diagnostic behavior. If we can remove // this reliance, we could drop all of this. SrcMgr = SourceMgr(); SrcMgr.takeSourceBuffersFrom(InputSrcMgr); SrcMgr.setIncludeDirs(InputSrcMgr.getIncludeDirs()); SrcMgr.setDiagHandler(InputSrcMgr.getDiagHandler(), InputSrcMgr.getDiagContext()); // Setup the record keeper and try to parse the file. auto *MainFileBuffer = SrcMgr.getMemoryBuffer(SrcMgr.getMainFileID()); Records.saveInputFilename(MainFileBuffer->getBufferIdentifier().str()); TGParser Parser(SrcMgr, /*Macros=*/std::nullopt, Records, /*NoWarnOnUnusedTemplateArgs=*/false, /*TrackReferenceLocs=*/true); bool ParseResult = Parser.ParseFile(); // After parsing, reclaim the source manager buffers from TableGen's global // manager. InputSrcMgr.takeSourceBuffersFrom(SrcMgr); SrcMgr = SourceMgr(); return ParseResult; }