1//===- Parser.cpp - Top-Level TableGen Parser implementation --------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/TableGen/Parser.h"
10#include "TGParser.h"
11#include "llvm/Support/MemoryBuffer.h"
12#include "llvm/TableGen/Record.h"
13
14using namespace llvm;
15
16bool llvm::TableGenParseFile(SourceMgr &InputSrcMgr, RecordKeeper &Records) {
17 // Initialize the global TableGen source manager by temporarily taking control
18 // of the input buffer in `SrcMgr`. This is kind of a hack, but allows for
19 // preserving TableGen's current awkward diagnostic behavior. If we can remove
20 // this reliance, we could drop all of this.
21 SrcMgr = SourceMgr();
22 SrcMgr.takeSourceBuffersFrom(SrcMgr&: InputSrcMgr);
23 SrcMgr.setIncludeDirs(InputSrcMgr.getIncludeDirs());
24 SrcMgr.setDiagHandler(DH: InputSrcMgr.getDiagHandler(),
25 Ctx: InputSrcMgr.getDiagContext());
26
27 // Setup the record keeper and try to parse the file.
28 auto *MainFileBuffer = SrcMgr.getMemoryBuffer(i: SrcMgr.getMainFileID());
29 Records.saveInputFilename(Filename: MainFileBuffer->getBufferIdentifier().str());
30
31 TGParser Parser(SrcMgr, /*Macros=*/std::nullopt, Records,
32 /*NoWarnOnUnusedTemplateArgs=*/false,
33 /*TrackReferenceLocs=*/true);
34 bool ParseResult = Parser.ParseFile();
35
36 // After parsing, reclaim the source manager buffers from TableGen's global
37 // manager.
38 InputSrcMgr.takeSourceBuffersFrom(SrcMgr);
39 SrcMgr = SourceMgr();
40 return ParseResult;
41}
42