[cfe-dev] prepare for calling ParseAST. Fatal error

Ivan Kush via cfe-dev cfe-dev at lists.llvm.org
Tue Nov 1 15:19:14 PDT 2016


I'm reading the book `Getting Started with LLVM Core Libraries` and trying to implement an example from page 100 `Chapter 4: Frontend`. But got an error on the last line of code `clang::ParseAST(CI.getSema());`:

    [bash at bash book]$ ./book_clang test.c 
    fatal error: error opening file '<invalid loc>': 


What should I add to prepare for `ParseAST`?

code:

    #include "llvm/ADT/IntrusiveRefCntPtr.h"
    #include "llvm/Support/CommandLine.h"
    
    #include "clang/Basic/Diagnostic.h"

    #include "clang/Frontend/CompilerInstance.h"

    #include "clang/Basic/TargetInfo.h"
    #include "clang/Basic/TargetOptions.h"

    #include "llvm/Support/Host.h"
    #include <memory>
    #include <string>

    #include "clang/Basic/FileManager.h"
    #include "clang/Basic/SourceManager.h"
    #include "clang/Lex/PreprocessorOptions.h"
    #include "clang/Lex/Preprocessor.h"

    #include "clang/AST/ASTConsumer.h"
    #include "clang/Frontend/ASTConsumers.h"

    #include "llvm/Support/raw_ostream.h"

    #include "clang/Parse/ParseAST.h"

    #include "clang/AST/ASTContext.h"


    static llvm::cl::opt<std::string> fileName(llvm::cl::Positional, llvm::cl::desc("Input file"), llvm::cl::Required);

    int main(int argc, char **argv)
    {
        llvm::cl::ParseCommandLineOptions(argc, argv, "My simple front end\n");
        clang::CompilerInstance CI;
        clang::DiagnosticOptions diagnosticOptions;
        CI.createDiagnostics();
        
        std::shared_ptr<clang::TargetOptions> PTO = std::make_shared<clang::TargetOptions>();
        PTO->Triple = llvm::sys::getDefaultTargetTriple();
        clang::TargetInfo *PTI = clang::TargetInfo::CreateTargetInfo(CI.getDiagnostics(), PTO);
        CI.setTarget(PTI);
        
        CI.createFileManager();//References getFileSystemOpts(), clang::vfs::getRealFileSystem(), hasVirtualFileSystem(), and setVirtualFileSystem().
        CI.createSourceManager( CI.getFileManager());//References getDiagnostics().
        CI.createPreprocessor(clang::TU_Complete);
        CI.getPreprocessorOpts().UsePredefines = false;

        std::unique_ptr< clang::ASTConsumer > astConsumer = clang::CreateASTPrinter(NULL, "");
        CI.setASTConsumer(std::move(astConsumer));
        
        CI.createASTContext();
        CI.createSema(clang::TU_Complete, NULL);//after getASTConsumer(), getASTContext(), and getPreprocessor().
        const clang::FileEntry *file =    CI.getFileManager().getFile(fileName);
        if (!file) {
            llvm::errs() << "File not found: " << fileName;
            return 1;
        }
        CI.getSourceManager().createFileID(file, clang::SourceLocation(), clang::SrcMgr::C_User);


        CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), 0);
        clang::ParseAST(CI.getSema());
        // Print AST statistics
    //   CI.getASTContext().PrintStats();
    //  CI.getASTContext().Idents.PrintStats();

        return 0;
    }

for executable need to pass c-file, for example:
**test.c**

    int main() {
    char *msg = "Hello, world!\n";
    write(1, msg, 14);
    return 0;
    }
    



-- 
Best wishes,
Ivan Kush



More information about the cfe-dev mailing list