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