[LLVMdev] clang : compiling in memory

EdB edb+llvm at sigluy.net
Wed Jun 18 10:27:12 PDT 2014


Hello

I'm trying to compile a module with all the code in memory.
However it failed when I try to included a header file.

I've try to find the right to do it be failed to...

Here an example :  input.c:1:10: fatal error: 'inc.h' file not found

/*
c++ `llvm-config --cxxflags --ldflags`  ./test-clang.cpp -o test-clang \
  -lclangFrontendTool -lclangFrontend -lclangDriver \
  -lclangSerialization -lclangCodeGen -lclangParse -lclangSema \
  -lclangAnalysis -lclangAST -lclangEdit -lclangLex -lclangBasic -lLLVM-3.4
*/

#include <clang/Frontend/CompilerInstance.h>
#include "clang/Lex/Preprocessor.h"
#include <clang/Frontend/TextDiagnosticBuffer.h>
#include <clang/Frontend/TextDiagnosticPrinter.h>
#include <clang/CodeGen/CodeGenAction.h>
#include <clang/Basic/TargetInfo.h>
#include <llvm/Bitcode/BitstreamWriter.h>
#include <llvm/Bitcode/ReaderWriter.h>
#if HAVE_LLVM < 0x0305
#include <llvm/Linker.h>
#else
#include <llvm/Linker/Linker.h>
#endif

#include <llvm/IR/DerivedTypes.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/IRReader/IRReader.h>

#include <llvm/PassManager.h>
#include <llvm/Support/TargetSelect.h>
#include <llvm/Support/MemoryBuffer.h>

#include <llvm/Transforms/IPO.h>
#include <llvm/Transforms/IPO/PassManagerBuilder.h>

#include <llvm/IR/DataLayout.h>

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <sstream>

const char * program_h =
"#define TEST_C 21\n";

const char * program_src =
"#include \"inc.h\"\n"
"\n"
"int main() \n"
"{\n"
"  int i;\n"
"  i = TEST_C;\n"
"  return i;\n"
"}\n";

int main() {

      clang::CompilerInstance c;
      clang::EmitLLVMOnlyAction act(&llvm::getGlobalContext());

      std::string log;
      llvm::raw_string_ostream s_log(log);

      //compiler options:
      std::vector<std::string> opts_array;

      opts_array.push_back("input.c");

      opts_array.push_back("-v");

      std::vector<const char *> opts_carray;
      for (unsigned i = 0; i < opts_array.size(); i++) {
         opts_carray.push_back(opts_array.at(i).c_str());
      }

      llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagID;
      llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts;
      clang::TextDiagnosticBuffer *DiagsBuffer;

      DiagID = new clang::DiagnosticIDs();
      DiagOpts = new clang::DiagnosticOptions();
      DiagsBuffer = new clang::TextDiagnosticBuffer();

      clang::DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer);
      bool Success;

      Success = clang::CompilerInvocation::CreateFromArgs(c.getInvocation(),
                                        opts_carray.data(),
                                        opts_carray.data() + 
opts_carray.size(),
                                        Diags);
      if (!Success) {
         std::cerr << "invalide option" << std::endl;
         return 1;
      }

      c.getFrontendOpts().ProgramAction = clang::frontend::EmitLLVMOnly;

      c.getHeaderSearchOpts().UseBuiltinIncludes = true;
      c.getHeaderSearchOpts().UseStandardSystemIncludes = true;


      c.getLangOpts().NoBuiltin = true;
      //c.getTargetOpts().Triple = triple;
      //c.getTargetOpts().CPU = processor;
      c.getInvocation().setLangDefaults(c.getLangOpts(), clang::IK_C, 
clang::LangStandard::lang_gnu99);
      c.createDiagnostics(
                          new clang::TextDiagnosticPrinter(
                                 s_log,
                                 &c.getDiagnosticOpts()));

      c.getPreprocessorOpts().addRemappedFile("input.c", 
llvm::MemoryBuffer::getMemBuffer(program_src));

// 			c.createFileManager();
// 			auto &fm = c.getFileManager();
// 			c.createSourceManager(fm);
// 			auto &sm = c.getSourceManager();

			llvm::MemoryBuffer* buffer = 
llvm::MemoryBuffer::getMemBuffer(program_h, "inc.h");
			c.getPreprocessorOpts().addRemappedFile("inc.h", buffer);


			//c.createPreprocessor()

      // Compile the code
      if (!c.ExecuteAction(act)) {
				printf("failed to compile\n");
				printf("%s", log.c_str());
				return 2;
			}

			act.takeModule();
      return 0;
}



More information about the llvm-dev mailing list