V-antena and Tanimoto's page

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

>

カテゴリー: Computer Languages

CATEGORY ARCHIVE

yy_buffer_state, yy_current_bufferやyy_scan_bufferなどは、flexの第3セクションでしか使えないとの事なので、これらを扱う関数をflexの第3セクションで定義し、他のところからこの関数を呼び出しする様にしたところエラーは消えた。

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



As I had encountered errors when I tried to install cupy, 
 on Ubuntu 18.04

 I upgrade cudnn. Then I succeeded installation of cupy.
 The following is a notes on the procedure.

 1. after uninstallation of existing pip, reinstall pip 

 curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
 python3 get-pip.py --user -vv
 python get-pip.py --user -vv
 install a recent cuda-toolkit 

 2-0. You should insatll nvidia-drivers first. the followings.
 2-1. download the cuda toolkit from 
        https://developer.nvidia.com/cuda-toolkit-archive

 2.2 install cuda-toolkit

 sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
 sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
 sudo apt-get update
 sudo apt-get install cuda

3.0 install cudnn 
 3-1 download packages for ubuntu18.04 from 
      https://developer.nvidia.com/rdp/cudnn-download

 3-2. install cudnn packages
 sudo dpkg -i libcudnn7_7.3.1.20-1+cuda10.0_amd64.deb
 sudo dpkg -i libcudnn7-dev_7.3.1.20-1+cuda10.0_amd64.deb
 sudo dpkg -i libcudnn7-doc_7.3.1.20-1+cuda10.0_amd64.deb

 3-3. replace the old cuda path with cuda-10.0 path
 nano ~/.bashrc
 NVIDIA CUDA Toolkit
 export PATH=/usr/local/cuda-10.0/bin:$PATH
 export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
 source ~/.bashrc
 echo $PATH |grep cuda
 install cupy 
 pip3 install --user cupy
 python3
   import cupy
   import cupy.cudnn
 failed. 
    modulenotfounderror: no module named 'cupy.cudnn' 
 so I did the following

 4.0 pip3 uninstall cupy

 set $CUDA_PATH as /usr/local/cuda
 pip3 -v install --user cupy --no-cache-dir
 python3
   import cupy
   import cupy.cudnn

 No error.

 additional
 sudo cp /usr/local/cuda/include/cuda_fp16.hpp /usr/include
 sudo cp /usr/local/cuda/include/cuda_fp16.h   /usr/include

LLVMのインストール(Ubuntu 18.04)

メモリーが3GB以上ないと長い時間がかかったあげく、outofmemoryで失敗するので注意。

1.最初にSVNをインストールしておく
  (下記のサイトを参考にした)
 How to Install SVN Server on Ubuntu 18.04 & 16.04 LTS
 
 但し、libapache2-svn がインストール出来なかった
 また、sudo service apache2 restart の位置は/etc/apache2/mods-enabled/dav_svn.c$
 変更が必要
 203 sudo apt update
 204 sudo apt upgrade
 205 sudo apt autoremove
 208 sudo apt install texinfo
 211 sudo apt install perl
 212 sudo apt install m4
 213 sudo apt install autoconf
 214 sudo apt install automake
 215 sudo apt install libtool
 216 sudo apt install apache2
 218 sudo apt-get install subversion libapache2-mod-svn libsvn-dev
 223 sudo a2enmod dav
 224 sudo a2enmod dav_svn
 226 sudo nano /etc/apache2/mods-enabled/dav_svn.conf
 Alias /svn /var/lib/svn
 
 DAV svn
 SVNParentPath /var/lib/svn
 AuthType Basic
 AuthName “Subversion Repository”
 AuthUserFile /etc/apache2/dav_svn.passwd
 Require valid-user
 
 225 sudo service apache2 restart
 228 sudo apt install graphviz xdot
 233 sudo mkdir -p /var/lib/svn/
 234 sudo svnadmin create /var/lib/svn/myrepo
 235 sudo chown -R www-data:www-data /var/lib/svn
 236 sudo chmod -R 775 /var/lib/svn
 237 sudo nano /etc/apache2/dav_svn.passwd
 238 sudo htpasswd -cm /etc/apache2/dav_svn.passwd admin
 2. llvm installation 
 229 mkdir llvm
 230 cd llvm
 svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
 cd llvm/tools
 svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
 cd ../projects
 svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
 mkdir ~/llvm/llvm-build
 cd ~/llvm/llvm-build
 ここから、http://llvm.org/docs/CMake.html を参考にした。
 cmake ~/llvm/llvm
 cmake ?build .
 sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/local/llvm -P cmake_install.cmake
 cmake ?build . ?target install
 nano ~/.bashrc
 export PATH=$PATH:/usr/local/llvm/bin
 source ~/.bashrc

V-antena and Tanimoto's page

あなたはIPv4でアクセスしています