V-antena and Tanimoto's page

谷本の備忘録・雑記帳・work

>

月: 2019年6月

MONTHLY ARCHIVE

きつねさんでもわかるLLVM 5.10節まで+5.11.2

「きつねさんでもわかるLLVM 」のDummyCCompilerがLLVM,GCC等のバージョン違いにより、コンパイルや実行ができなかったのでいろいろ試し、変更して5.10節まで(一部を除き)動く様になったので、
変更のあらましを記録しておく。
(追加:5.11.2の部分も動かせたので追加。JIT部分はまだできない)

---------------------------------------------------------------
1.src/dcc.cpp内のinclude文の調整

#include "llvm/Assembly/PrintModulePass.h"
=>
#include "llvm/IR/IRPrintingPasses.h"

llvm::Linker::LinkModules      
=>  別のところ
llvm::Linker::linkModules


#include "llvm/LLVMContext.h"
=>
#include "llvm/IR/LLVMContext.h"

#include "llvm/Module.h"
=>
#include "llvm/IR/Module.h"

#include "llvm/PassManager.h"
=>
#include "llvm/IR/LegacyPassManager.h"

追加
#include "llvm/Support/FileSystem.h"  //added
#include <fcntl.h>  //added
#include <sys/stat.h>  //added
#include "llvm/Support/raw_ostream.h"  //added


2.inc/codegen.hpp内のinclude文の調整
----------inc/codegen.hpp---------------
#include<llvm/Constants.h>
=>
#include<llvm/IR/Constants.h>

#include<llvm/ExecutionEngine/JIT.h>
 =>
#include<llvm/ExecutionEngine/MCJIT.h>

#include<llvm/Linker.h>
=>
#include<llvm/Linker/Linker.h>

#include<llvm/LLVMContext.h>
=>
#include<llvm/IR/LLVMContext.h>

#include <llvm/Module.h>
=>
#include <llvm/IR/Module.h>

#include<llvm/Metadata.h>
=>
#include<llvm/IR/Metadata.h>

#include<llvm/IRBuilder.h>
=>
#include<llvm/IR/IRBuilder.h>

#include<llvm/Support/IRReader.h>
=>
#include<llvm/IRReader/IRReader.h>

#include<llvm/MDBuilder.h>
=>
#include<llvm/IR/MDBuilder.h>

#include<llvm/ValueSymbolTable.h>
=>
#include<llvm/IR/ValueSymbolTable.h>

追加
#include<llvm/ADT/STLExtras.h>
#include<llvm/Support/SourceMgr.h>

------------------------------------------------------
3. src/dcc.cppでPassManagerとPrintStackTraceの使い方変更


        llvm::sys::PrintStackTraceOnErrorSignal();
 =>
        llvm::sys::PrintStackTraceOnErrorSignal(*argv);


        llvm::PassManager pm;
 =>
        llvm::legacy::PassManager pm;
        
-------------------------------------------------------------
4. inc/AST.hppで、addStatementが明示的なreturnがないという
  アラーム対応

bool addStatement(BaseAST *stmt){StmtLists.push_back(stmt);}
=>
bool addStatement(BaseAST *stmt){StmtLists.push_back(stmt); return true;}

--------------------------------------------------------------
5. src/codegen.cppで、getGlobalContext()が使えなくなってい事の
  対処

static llvm::LLVMContext TheContext;  //added


llvm::getGlobalContext()
=>
TheContext

--------------------------------------------------------
6.src/codege.cppで、ParseIRFileが無くなっている事及び型が変わった事に対する対処

llvm::Module *link_mod = llvm::ParseIRFile(file_name, err, TheContext);

=>
std::unique_ptr<llvm::Module> link_mod = llvm::parseIRFile(file_name, err, TheContext);



---------------------------------------------------------
7. src/codegen.cppで、ValueSymbolTableでエラーになる対応

     llvm::ValueSymbolTable  &vs_table= CurFunc->getValueSy$
         vs_table.lookup

=>

     llvm::ValueSymbolTable* vs_table= CurFunc->getValueSy$
        vs_table->lookup

and so oon

-------------------------------------------------------------------
8. src/codegen.cpp で、Linker::DestroySourceが無くなっている事に対する対応

 llvm::Linker::DestroySource
 
 =>
 
 llvm::None
 
-------------------------------------------------------------------
9. src/dcc.cppで、raw_fd_ostreamの引数が変わっている事に対する対応

      std::string error;
 =>
      std::error_code ec;  //changed for string

   --------------------------

      llvm::raw_fd_ostream raw_stream(opt.getOutputFileName().c_str(), ec,
           // error to ec
           
           
         pm.add(llvm::createPrintModulePass(raw_stream));
  
       &raw_stream  ->  raw_stream
       (because * -> & )

------------------------------------------------------------
10. src/codegen.cppで、最後まで行かないというアラーム対応

  1)generateJumpStatement にreturn ret_v; を追加
  2) generateBinaryExpressionに、 else return NULL;を追加

---------------------------------------------------------------
11. Makefileで、リンカーエラーの対応

 LLVM_FLAGS = --cxxflags --ldflags --libs
=>
 LLVM_FLAGS = --cxxflags --ldflags --libs  --system-libs

---------------------------------------------------------------------
12. LinkModulesが変わっている事及び引数の型が変わっている事の対応

if(llvm::Linker::LinkModules(dest, link_mod, llvm::Linker::DestroySource, &err_msg))
     =>
if(llvm::Linker::linkModules(*dest, std::move(link_mod),llvm::Linker::None ))


----------------------------------------------------------------------
13. 

//      SAFE_DELETE(link_mod);
512 //  replace with
513         SAFE_DELETEU(link_mod);
514


5.11のJIT部分をskipする。

       
        //JITのフラグが立っていたらJIT 相当部分をskip
        
        bool CodeGen::linkModule(llvm::Module *dest, std::string file_name) の関数部分をskip
        
        
14. EngineBuilderの引数が、uniqu_ptrになっている事の対応

src/codegen.cppの修正

llvm::ExecutionEngine *EE = llvm::EngineBuilder(Mod).create();
llvm::EngineBuilder(Mod).create();
=>
std::unique_ptr<llvm::Module> Modptr;
Modptr.reset(Mod);
llvm::ExecutionEngine *EE = llvm::EngineBuilder(std::move(Modptr)).create();
Modptr.reset(Mod);
llvm::EngineBuilder(std::move(Modptr)).create();
llvm::Module *Mod=Modptr.release();



V-antena and Tanimoto's page