181ad6265SDimitry Andric //===- Parser.cpp - Top-Level TableGen Parser implementation --------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric
981ad6265SDimitry Andric #include "llvm/TableGen/Parser.h"
1081ad6265SDimitry Andric #include "TGParser.h"
1181ad6265SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
1281ad6265SDimitry Andric #include "llvm/TableGen/Record.h"
1381ad6265SDimitry Andric
1481ad6265SDimitry Andric using namespace llvm;
1581ad6265SDimitry Andric
TableGenParseFile(SourceMgr & InputSrcMgr,RecordKeeper & Records)1681ad6265SDimitry Andric bool llvm::TableGenParseFile(SourceMgr &InputSrcMgr, RecordKeeper &Records) {
1781ad6265SDimitry Andric // Initialize the global TableGen source manager by temporarily taking control
1881ad6265SDimitry Andric // of the input buffer in `SrcMgr`. This is kind of a hack, but allows for
1981ad6265SDimitry Andric // preserving TableGen's current awkward diagnostic behavior. If we can remove
2081ad6265SDimitry Andric // this reliance, we could drop all of this.
2181ad6265SDimitry Andric SrcMgr = SourceMgr();
2281ad6265SDimitry Andric SrcMgr.takeSourceBuffersFrom(InputSrcMgr);
2381ad6265SDimitry Andric SrcMgr.setIncludeDirs(InputSrcMgr.getIncludeDirs());
2481ad6265SDimitry Andric SrcMgr.setDiagHandler(InputSrcMgr.getDiagHandler(),
2581ad6265SDimitry Andric InputSrcMgr.getDiagContext());
2681ad6265SDimitry Andric
2781ad6265SDimitry Andric // Setup the record keeper and try to parse the file.
2881ad6265SDimitry Andric auto *MainFileBuffer = SrcMgr.getMemoryBuffer(SrcMgr.getMainFileID());
2981ad6265SDimitry Andric Records.saveInputFilename(MainFileBuffer->getBufferIdentifier().str());
3081ad6265SDimitry Andric
31*bdd1243dSDimitry Andric TGParser Parser(SrcMgr, /*Macros=*/std::nullopt, Records,
32*bdd1243dSDimitry Andric /*NoWarnOnUnusedTemplateArgs=*/false,
33*bdd1243dSDimitry Andric /*TrackReferenceLocs=*/true);
3481ad6265SDimitry Andric bool ParseResult = Parser.ParseFile();
3581ad6265SDimitry Andric
3681ad6265SDimitry Andric // After parsing, reclaim the source manager buffers from TableGen's global
3781ad6265SDimitry Andric // manager.
3881ad6265SDimitry Andric InputSrcMgr.takeSourceBuffersFrom(SrcMgr);
3981ad6265SDimitry Andric SrcMgr = SourceMgr();
4081ad6265SDimitry Andric return ParseResult;
4181ad6265SDimitry Andric }
42