「きつねさんでもわかる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();