xref: /aosp_15_r20/external/llvm/lib/AsmParser/Parser.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- Parser.cpp - Main dispatch module for the Parser library -----------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This library implements the functionality defined in llvm/AsmParser/Parser.h
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h"
15*9880d681SAndroid Build Coastguard Worker #include "LLParser.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
21*9880d681SAndroid Build Coastguard Worker #include <cstring>
22*9880d681SAndroid Build Coastguard Worker #include <system_error>
23*9880d681SAndroid Build Coastguard Worker using namespace llvm;
24*9880d681SAndroid Build Coastguard Worker 
parseAssemblyInto(MemoryBufferRef F,Module & M,SMDiagnostic & Err,SlotMapping * Slots)25*9880d681SAndroid Build Coastguard Worker bool llvm::parseAssemblyInto(MemoryBufferRef F, Module &M, SMDiagnostic &Err,
26*9880d681SAndroid Build Coastguard Worker                              SlotMapping *Slots) {
27*9880d681SAndroid Build Coastguard Worker   SourceMgr SM;
28*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(F);
29*9880d681SAndroid Build Coastguard Worker   SM.AddNewSourceBuffer(std::move(Buf), SMLoc());
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker   return LLParser(F.getBuffer(), SM, Err, &M, Slots).Run();
32*9880d681SAndroid Build Coastguard Worker }
33*9880d681SAndroid Build Coastguard Worker 
parseAssembly(MemoryBufferRef F,SMDiagnostic & Err,LLVMContext & Context,SlotMapping * Slots)34*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> llvm::parseAssembly(MemoryBufferRef F,
35*9880d681SAndroid Build Coastguard Worker                                             SMDiagnostic &Err,
36*9880d681SAndroid Build Coastguard Worker                                             LLVMContext &Context,
37*9880d681SAndroid Build Coastguard Worker                                             SlotMapping *Slots) {
38*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M =
39*9880d681SAndroid Build Coastguard Worker       make_unique<Module>(F.getBufferIdentifier(), Context);
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker   if (parseAssemblyInto(F, *M, Err, Slots))
42*9880d681SAndroid Build Coastguard Worker     return nullptr;
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker   return M;
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker 
parseAssemblyFile(StringRef Filename,SMDiagnostic & Err,LLVMContext & Context,SlotMapping * Slots)47*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> llvm::parseAssemblyFile(StringRef Filename,
48*9880d681SAndroid Build Coastguard Worker                                                 SMDiagnostic &Err,
49*9880d681SAndroid Build Coastguard Worker                                                 LLVMContext &Context,
50*9880d681SAndroid Build Coastguard Worker                                                 SlotMapping *Slots) {
51*9880d681SAndroid Build Coastguard Worker   ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
52*9880d681SAndroid Build Coastguard Worker       MemoryBuffer::getFileOrSTDIN(Filename);
53*9880d681SAndroid Build Coastguard Worker   if (std::error_code EC = FileOrErr.getError()) {
54*9880d681SAndroid Build Coastguard Worker     Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
55*9880d681SAndroid Build Coastguard Worker                        "Could not open input file: " + EC.message());
56*9880d681SAndroid Build Coastguard Worker     return nullptr;
57*9880d681SAndroid Build Coastguard Worker   }
58*9880d681SAndroid Build Coastguard Worker 
59*9880d681SAndroid Build Coastguard Worker   return parseAssembly(FileOrErr.get()->getMemBufferRef(), Err, Context, Slots);
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker 
parseAssemblyString(StringRef AsmString,SMDiagnostic & Err,LLVMContext & Context,SlotMapping * Slots)62*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> llvm::parseAssemblyString(StringRef AsmString,
63*9880d681SAndroid Build Coastguard Worker                                                   SMDiagnostic &Err,
64*9880d681SAndroid Build Coastguard Worker                                                   LLVMContext &Context,
65*9880d681SAndroid Build Coastguard Worker                                                   SlotMapping *Slots) {
66*9880d681SAndroid Build Coastguard Worker   MemoryBufferRef F(AsmString, "<string>");
67*9880d681SAndroid Build Coastguard Worker   return parseAssembly(F, Err, Context, Slots);
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker 
parseConstantValue(StringRef Asm,SMDiagnostic & Err,const Module & M,const SlotMapping * Slots)70*9880d681SAndroid Build Coastguard Worker Constant *llvm::parseConstantValue(StringRef Asm, SMDiagnostic &Err,
71*9880d681SAndroid Build Coastguard Worker                                    const Module &M, const SlotMapping *Slots) {
72*9880d681SAndroid Build Coastguard Worker   SourceMgr SM;
73*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);
74*9880d681SAndroid Build Coastguard Worker   SM.AddNewSourceBuffer(std::move(Buf), SMLoc());
75*9880d681SAndroid Build Coastguard Worker   Constant *C;
76*9880d681SAndroid Build Coastguard Worker   if (LLParser(Asm, SM, Err, const_cast<Module *>(&M))
77*9880d681SAndroid Build Coastguard Worker           .parseStandaloneConstantValue(C, Slots))
78*9880d681SAndroid Build Coastguard Worker     return nullptr;
79*9880d681SAndroid Build Coastguard Worker   return C;
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker 
parseType(StringRef Asm,SMDiagnostic & Err,const Module & M,const SlotMapping * Slots)82*9880d681SAndroid Build Coastguard Worker Type *llvm::parseType(StringRef Asm, SMDiagnostic &Err, const Module &M,
83*9880d681SAndroid Build Coastguard Worker                       const SlotMapping *Slots) {
84*9880d681SAndroid Build Coastguard Worker   unsigned Read;
85*9880d681SAndroid Build Coastguard Worker   Type *Ty = parseTypeAtBeginning(Asm, Read, Err, M, Slots);
86*9880d681SAndroid Build Coastguard Worker   if (!Ty)
87*9880d681SAndroid Build Coastguard Worker     return nullptr;
88*9880d681SAndroid Build Coastguard Worker   if (Read != Asm.size()) {
89*9880d681SAndroid Build Coastguard Worker     SourceMgr SM;
90*9880d681SAndroid Build Coastguard Worker     std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);
91*9880d681SAndroid Build Coastguard Worker     SM.AddNewSourceBuffer(std::move(Buf), SMLoc());
92*9880d681SAndroid Build Coastguard Worker     Err = SM.GetMessage(SMLoc::getFromPointer(Asm.begin() + Read),
93*9880d681SAndroid Build Coastguard Worker                         SourceMgr::DK_Error, "expected end of string");
94*9880d681SAndroid Build Coastguard Worker     return nullptr;
95*9880d681SAndroid Build Coastguard Worker   }
96*9880d681SAndroid Build Coastguard Worker   return Ty;
97*9880d681SAndroid Build Coastguard Worker }
parseTypeAtBeginning(StringRef Asm,unsigned & Read,SMDiagnostic & Err,const Module & M,const SlotMapping * Slots)98*9880d681SAndroid Build Coastguard Worker Type *llvm::parseTypeAtBeginning(StringRef Asm, unsigned &Read,
99*9880d681SAndroid Build Coastguard Worker                                  SMDiagnostic &Err, const Module &M,
100*9880d681SAndroid Build Coastguard Worker                                  const SlotMapping *Slots) {
101*9880d681SAndroid Build Coastguard Worker   SourceMgr SM;
102*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);
103*9880d681SAndroid Build Coastguard Worker   SM.AddNewSourceBuffer(std::move(Buf), SMLoc());
104*9880d681SAndroid Build Coastguard Worker   Type *Ty;
105*9880d681SAndroid Build Coastguard Worker   if (LLParser(Asm, SM, Err, const_cast<Module *>(&M))
106*9880d681SAndroid Build Coastguard Worker           .parseTypeAtBeginning(Ty, Read, Slots))
107*9880d681SAndroid Build Coastguard Worker     return nullptr;
108*9880d681SAndroid Build Coastguard Worker   return Ty;
109*9880d681SAndroid Build Coastguard Worker }
110