タグ

*programとvmに関するsh19910711のブックマーク (72)

  • LLVMのプロファイル情報を紐解いてみた〜カバレッジ編〜 - Qiita

    コードカバレッジ結果を保存するフォーマットについて調べてみました。主な情報源はLLVMのドキュメントとソースコードです。 LLVM Code Coverage Mapping Format LLVM LLVM Compiler-rt データ プロファイル情報取得 プロファイル情報は以下のようにして取得しました。default.profrawにカバレッジ結果が詰まっているようなのですが、バイナリデータのため、すぐには取り出せません。このフォーマットを調べてみます。 $ cd /tmp $ cat a.c #include <stdio.h> int main(void) { printf("Hello, World\n"); return 0; } $ xcrun clang -g -Wall -Werror -O0 -fprofile-instr-generate -fcoverage-m

    LLVMのプロファイル情報を紐解いてみた〜カバレッジ編〜 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "default.profrawにカバレッジ結果が詰まっているようなのですが、バイナリデータのため、すぐには取り出せません / raw-two-profiles.testにあるrawデータのテストファイルを参考" 2017
  • LLVMでFizzBuzz - Qiita

    ; ModuleID = 'test.c' source_filename = "test.c" target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello, world\0A\00", align 1 ; Function Attrs: nounwind uwtable define i32 @main() #0 { %1 = alloca i32, align 4 store i32 0, i32* %1, align 4 %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds

    LLVMでFizzBuzz - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMのAPIを呼び出して、FizzBuzzを実行する LLVM IR を生成 / 最近では、IDE(統合開発環境)で静的解析やリファクタリング支援機能を提供するためにもLLVMが利用されるケースが増えてきている" 2017
  • lldでwasmをリンクするまで - Qiita

    TL;DR; lldを使えばwasm32-wasm向けにコンパイルされた.oファイルをリンクして、WASMを出力できます。 書いてある内容はLinux、もしくはmacOSでは、そのまま使えると思います。使用しているLLDは6.0.0です。 ClangでもWASMを作れます。 CからWASMを作成するにはEmscriptenを使う、というのが普通でした。というより、ほぼ唯一の手段だった時もありました。 WASMのMVPがリリースされて以降、多くのコミュニティでWASMに対応するための開発がなされました。その一つの結果として、LLVMを利用したC/C++コンパイラーのClangがWASMに対応をしました。その後、LLVM向けのリンカlldもWASMに対応するようになりました。 この結果、次のようなパスで.wasmファイルを作れるようになりました。

    lldでwasmをリンクするまで - Qiita
    sh19910711
    sh19910711 2024/06/18
    "CからWASMを作成するにはEmscriptenを使う、というのが普通でした。というより、ほぼ唯一の手段だった時もありました / lldを使えばwasm32-wasm向けにコンパイルされた.oファイルをリンクして、WASMを出力できます 2017
  • リンク前に不必要なシンボルを削除する - Qiita

    int do_things(void); int application_main(void) { return do_things(); } int test_main(void) { return 42; } int main(void) { return test_main(); } 元の問題は、application_mainとtest_mainを(おそらくはプリプロセッサで)切り替えたいのですが、ライブラリに関数do_thingsが実装されていないためリンクが失敗します。 /tmp/demo-d19626.o: 関数 `application_main' 内: demo.c:(.text+0x5): `do_things' に対する定義されていない参照です clang-6.0: error: linker command failed with exit code 1 (use

    リンク前に不必要なシンボルを削除する - Qiita
    sh19910711
    sh19910711 2024/06/18
    "application_mainとtest_mainを(おそらくはプリプロセッサで)切り替えたい / ライブラリに関数do_thingsが実装されていないためリンクが失敗 / このdo_thingsをリンク前に除けるかという問題" 2018
  • アプリケーションを高速化するBOLTを試してみた - Qiita

    はじめに Facebookがアプリケーションを高速化するBOLTというツールを公開したので試してみました。 以下によると、2-15% ほどアプリケーションの性能が上がるそうです。 記事を読む感じだと、プロファイルデータをもとにプログラムバイナリの配置を修正し、プログラム命令自体の CPU キャッシュへの載り方とTLBミスの発生を最適化するようです。 環境 CentOS7 の環境でやりました。 BOLT (perf) は CPU のパフォーマンスカウンタを使って性能プロファイリングをするので、AWSなどの仮想マシンでは実行できない可能性があります。 また、BOLTのビルド時にはかなり大量のメモリを使います。ビルドだけはAWSなどを利用したほうが良いかもしれません。(私は m5.4xlarge を使いました。) 環境 OS: CentOS 7.4 メモリ: 64GB 程度 ※BOLT ビルド時

    アプリケーションを高速化するBOLTを試してみた - Qiita
    sh19910711
    sh19910711 2024/06/18
    "Facebookがアプリケーションを高速化するBOLTというツールを公開 / プロファイルデータをもとにプログラムバイナリの配置を修正し、プログラム命令自体の CPU キャッシュへの載り方とTLBミスの発生を最適化する" 2018
  • LLVM 6.0 で作るフロントエンドの道しるべ - Qiita

    記事はC++でLLVM 6.0を用いてフロントエンドを作成する、その第一歩を踏み出すための記事です。はじめに、C++でLLVM IRを生成する方法を知るために最小構成のコードを解説し、そのあとPhiの扱いと組み込み関数の実装方法を紹介します。 筆者は今まで、いくつかおもちゃレベルのプログラミング言語を作ってきました。その中でLLVM対応したいという漠然とした思いから きつねさんでもわかるLLVM や Kaleidoscope に挑戦1しました。しかし、バージョンの壁、ドキュメント量の壁、検索しても古い情報しか出てこない壁などに当たってくじけていました。 気で取り組み始めた結果、それらの壁をなんとか突破することができ、LLVM 6.0を用いたフロントエンド実装を作ることができました。そこで得た知見を、同じ悩みを持つ人のためにまとめました。 成果物のコードだけを参照したい方は、 ysaka

    LLVM 6.0 で作るフロントエンドの道しるべ - Qiita
    sh19910711
    sh19910711 2024/06/18
    "C++でLLVM 6.0を用いてフロントエンドを作成 / LLVM対応したいという漠然とした思いからきつねさんでもわかるLLVMやKaleidoscopeに挑戦 / しかし、バージョンの壁、ドキュメント量の壁、検索しても古い情報しか出てこない壁" 2018
  • Rustcに付随しているLLVMを使う - Qiita

    注:以下の方法はWindows(*-pc-windows-msvc)では使えません Rustはアセンブラを生成するためにLLVMのライブラリを使います。これはtoolchainに含まれていて、例えばお手元の~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/codegen-backendsを覗いてみてください(ちなみにlibcoreやlibstdもこの辺にあります)。ここにlibrustc_codegen_llvm-llvm.soという共有ファイルがあり、これにLLVMのライブラリが含まれています。 一方、ユーザーがRustでLLVMを使う方法としては、例えば以下の記事でも紹介されていますが、llvm-sysがあります。 RustでLLVMしてみたメモ llvm-

    Rustcに付随しているLLVMを使う - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMのインストールは存外面倒で、パッケージ管理システム(apt,dnf等)で入るものが古すぎたりします / Rustはアセンブラを生成するためにLLVMのライブラリを使います。これはtoolchainに含まれていて" 2018
  • RustでLLVM IRを出力するためのcrate「inkwell」について - Qiita

    はじめに RustでLLVM IRを出力するcrateとしてLLVM C APIのbindingであるllvm-sys.rsがあります。しかしllvm-sys.rsは非常に薄く、不足する機能は自力で提供してやらなければなりません。またドキュメントやテストもほとんどなく、初見の場合は既存の実装を参照しながら手探りでやっていく必要が出てきます。 同様にLLVM IRを出力するcrateとしてinkwellがあります。inkwellは便利なllvm-sys.rsのラッパーです。llvm-sys.rsで不足していた機能やドキュメントなどが大幅に追加されています。記事ではそんな素敵なinkwellを紹介したいと思います。 inkwellの良いところ 他にもたくさんあるとは思いますが、個人的に良いなと思ったのは以下です。主に上2つについて簡単に説明できればと思います。私はllvm-sys.rsを用い

    RustでLLVM IRを出力するためのcrate「inkwell」について - Qiita
    sh19910711
    sh19910711 2024/06/18
    "llvm-sys.rs: RustでLLVM IRを出力するcrate + LLVM C APIのbinding / 非常に薄く、不足する機能は自力 / ドキュメントやテストもほとんどなく、初見の場合は既存の実装を参照しながら手探りでやっていく必要" 2018
  • RustのコードをCに変換する - Qiita

    この記事はsoftdeviceのみんなでゆるく記事を書く。の16日目の記事です(遅刻) 先日おもむろにRustでメガドライブの開発をしてみたくなり調べたところ、現在Rustは標準でメガドライブの命令セットM68000向けのビルドに対応していませんでした。 このような場合RustからLLVMの中間コードを出力し、M68000向けのバックエンドでバイナリを出力するのが正当なやりかたのような気もするのですが、ふとRustのコードをCへと変換することができればSDCCなどの既存のCコンパイラを使うことができるのではと思ってRustからCへのトランスパイルについて調べてみました。 調べた限りではLLVM-CBEとmrustcを使う二通りの方法があり、それぞれを試してみました。 変換するRustのコード 単純な出力をするだけのコードをCに変換してみます。

    RustのコードをCに変換する - Qiita
    sh19910711
    sh19910711 2024/06/18
    "Rustは標準でメガドライブの命令セットM68000向けのビルドに対応していませんでした / このような場合RustからLLVMの中間コードを出力し、M68000向けのバックエンドでバイナリを出力する" 2018
  • LLVM:IR:条件分岐コードの作り方 - Qiita

    概要 LLVMのIRで分岐を実現するためにはIRBuilderクラスのメソッドCreateCondBr()を使います。 分岐先を判定するための評価値へのポインタ、評価値がTrue/Falseであったときのそれぞれのジャンプ先のBasicBlockへのポインタを指定する必要があります。 簡単な例 以下の複数のBasicBlockからなる関数main()の先頭のBasicBlockのお尻をCreateCondBr()を使用して作成したbr命令に入れ替えてみます。(入れ替えることに意味はありません!説明のための例です!) 操作対象のLLVM IR ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca i32

    LLVM:IR:条件分岐コードの作り方 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMのIRで分岐を実現する / 分岐先を判定するための評価値へのポインタ、評価値がTrue/Falseであったときのそれぞれのジャンプ先のBasicBlockへのポインタを指定する" 2019
  • RustでLLVMするためのcrate、Inkwellを触ってみた - Qiita

    RustでLLVMを使った言語処理系を作りたかったので、とりあえずInkwellを動かすところまでやりました。 Inkwellはllvm-sys.rsのラッパーで、"淡々とunsafeな関数をラップしてsafeな関数にしていくという面倒な作業がなくなるというのは大変ありがたいです"とのことです。良さげですね。 RustでLLVM IRを出力するためのcrate「inkwell」について - Qiita Cargo.toml 以下を追加します。LLVMの最新版は3月にリリースされたLLVM 8ですが、まだ対応ブランチがないので、LLVM 7を使うことにします。

    RustでLLVMするためのcrate、Inkwellを触ってみた - Qiita
    sh19910711
    sh19910711 2024/06/18
    "RustでLLVMを使った言語処理系を作りたかったので、とりあえずInkwellを動かすところまで / Inkwell: llvm-sys.rsのラッパーで、"淡々とunsafeな関数をラップしてsafeな関数にしていくという面倒な作業がなくなる" 2019
  • LLVM IRをデバッグする方法 - Qiita

    モチベーション llvmのフロントエンドを開発するとき,LLVM IRのアセンブラを直接デバッグ検証したいことがあると思います。 ネットに有用な情報がなかったので方法を探してみました。 他のフロントエンド開発者の方はどうしているのでしょうか・・・? 結論 debugifyという最適化パスを通せば,lldbでデバッグできる。 ふつうのソースのデバッグよりかなりめんどい。 詳細 debugifyパスによるデバッグ情報付きのLLVMの生成 debugifyはもともとデバッグ情報が他の最適化パスによって不整合にならないことを検証するためのものでありすべてのLLVM IRの命令,変数,関数にデバッグ情報を付加するパスである。 ここからは例として,以下のtest.cから生成したLLVM IRをベースに説明する。 /*[ test.c ]*/ int add(int x, int y); int mai

    LLVM IRをデバッグする方法 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "llvmのフロントエンドを開発するとき,LLVM IRのアセンブラを直接デバッグ検証したい / debugifyという最適化パスを通せば,lldbでデバッグできる / ふつうのソースのデバッグよりかなりめんどい" 2019
  • [LLVM超入門] [C++] LLVMを利用してLLVM IRを生成してみる - Qiita

    First みなさんこんにちは。あきっちです。 いきなりですがLLVM、知っていますか?もちろんみなさんならご存じですよね。 そうです。コンパイラ基盤です。 最近のプログラミング言語ではよく採用されているようで、とっても優秀らしいです。 私たちも流れに乗ってやってみましょう!! 前提条件など C++が多少かける CMakeのやり方がわかる includeディレクトリが適切に設定できる リンクエラーしてもめげない心 筆者の環境 Windows 10 Home i7 7700HQ RAM 16GB Visual Studio 2019 Community 環境構築など この方が書いてくださっている LLVMに実行可能コードの生成をまかせたいがとってもわかりやすいです。 LLVMには中間表現(IR)があり、任意のフロントエンドがIRにすることであとはLLVMに実行ファイルの生成と最適化を任せるこ

    [LLVM超入門] [C++] LLVMを利用してLLVM IRを生成してみる - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMには中間表現(IR)があり、任意のフロントエンドがIRにすることであとはLLVMに実行ファイルの生成と最適化を任せることが出来ます / IRで数値を扱うには: Valueというそれっぽいもの + これを使って数値を作ります" 2019
  • libclang/libLLVM で CUDA 言語相当の JIT コンパイル機能を自前 C++ アプリに組み込んで CUDA(PTX) 実行するメモ - Qiita

    libclang/libLLVM で CUDA 言語相当の JIT コンパイル機能を自前 C++ アプリに組み込んで CUDA(PTX) 実行するメモCUDAclangLLVMjit 背景 clang/LLVM を使って, C/C++/CUDA JIT アプリを自前 C++ アプリに組み込みたい CUDA だと, NVRTC などはあるがシステムに nvcc などがインストールされている必要があり, アプリ単体配布で完結するというのができない prebuilt package だと, RTTI/例外などのコンパイルオプションが違ったりする + STL が違ったりでアプリへのリンク + JIT コンパイルがうまくいかないため, clang/LLとVM をソースからビルドする必要がある 目的 nvcc など SDK 不要で, nvidia ドライバだけインストールされている環境で CUDA(C

    libclang/libLLVM で CUDA 言語相当の JIT コンパイル機能を自前 C++ アプリに組み込んで CUDA(PTX) 実行するメモ - Qiita
    sh19910711
    sh19910711 2024/06/18
    "CUDA だと, NVRTC などはあるがシステムに nvcc などがインストールされている必要があり, アプリ単体配布で完結するというのができない / nvcc: 最近は clang/llvm ベースなので(昔は Open64 compiler ベースだった)" 2020
  • LLVM の Kaleidoscope を育てながら作る - Qiita

    この記事は言語実装 Advent Calendar 2020 3日目の記事です。前回は sisshiki1969 さんの「ruruby: RustでつくっているRuby」、次回は yharaさんの「Shiika進捗」です。 趣旨 LLVM を使って小さな言語を実装してみます。 方針としては、最小限の機能の言語から出発して動くものを少しづつ大きくしていきます。ゴールは LLVM 公式のチュートリアルである Kaleidoscope の序盤相当の部分で、次のプログラムが動くことを目標とします。 def fib(n) if n < 3 then 1 else fib(n-1) + fib(n-2); fib(10) #=> 55 想定する読者 LLVM や LLVM IR がどういうものか何となく知っている Haskell がなんとなく分かる ただしコードにはコメントを入れて、LLVM IR や

    LLVM の Kaleidoscope を育てながら作る - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVM を使って小さな言語を実装 / 最小限の機能の言語から出発して動くものを少しづつ大きく / 公式のチュートリアルである Kaleidoscope の序盤相当の部分で、次のプログラムが動くことを目標" 2020
  • 自作コンパイラ基盤の話 - Qiita

    これは、言語実装 Advent Calendar 2020 19日目の記事です。 最近は、コンパイラやインタプリタなどの言語処理系や、それに類するものを作る人が増えてきています。(私の周りだけかもしれませんが。) しかし、もう一歩進んで、コンパイラ基盤を作ってみたという話はあまり聞きません。 コンパイラ基盤は、それの対象とするアーキテクチャについてや、それ自体の使い勝手を考えるのが非常に面白いものです。また、コンパイラ基盤を作る中で、コンパイラや計算機自体についてより深く学ぶことが出来ます。 この記事では、私が開発中のコンパイラ基盤を例として、コンパイラ基盤について語っていきます。 そもそもコンパイラ基盤とは コンパイラ基盤と言えば、近年色々な所で目にするのがLLVMです。 LLVMを使うことで、コンパイラの複雑で面倒な部分を避けつつ、コンパイラを構成することができるようになりました。 下

    自作コンパイラ基盤の話 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "LLVMを使うことで、コンパイラの複雑で面倒な部分を避けつつ、コンパイラを構成することができるようになり / 最近は、コンパイラやインタプリタなどの言語処理系や、それに類するものを作る人が増えてきています" 2020
  • 自作言語(コンパイラ作成)の進め方 - Qiita

    42tokyo Advent Calendar 2020の20日目の記事です。 私は一ヶ月ほど前まで自作言語の開発をしていました。作ったやつ 自作言語に関する知識がゼロの状態から開発を始めたため、どのように進めていけばいいのかわからず苦労しました。そこで、自作言語に興味があっても進め方がわからない人に向けてオススメの進め方をまとめてみました。ぜひ参考にしてみてください!! ※この進め方はc++の知識を前提としています まずコンパイラの理論を学ぶ ここでソースコードというテキストファイルが、どのように目的コードへ翻訳されていくのか一通りイメージできるようになっておきましょう。基的に「構文解析→AST生成→目的コードへコンパイル」という流れになっています。実装もこの流れで行うといいでしょう。 ASTとは簡単に言ってしまうと「コードから必要な意味だけ抽出した木構造」です。こいつをもとに最終的な

    自作言語(コンパイラ作成)の進め方 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "テキストファイルが、どのように目的コードへ翻訳されていくのか一通りイメージできるようになっておきましょう / 基本的に「構文解析→AST生成→目的コードへコンパイル」という流れ" 2020
  • clangでコールグラフを出力 - Qiita

    https://stackoverflow.com/questions/5373714/how-to-generate-a-calling-graph-for-c-code/5373814#5373814 ここの記載を参考にやってみた、というお話です。 やってみた、調べた、をメモがてら残そうと思った記事なので、話の裏どりはあまりしていません。 検証環境 MacOS11.1 clang++(homebrew) 11.0.0 homebrewで必要なツールをインストール macにプリインストールされているllvmではoptコマンドが入っていないので、homebrewを使ってインストールしました。 dotファイルのプレビュー用にgraphvizというソフトをインストールしました。 記事を参考に実行 dotファイルの作成 下記のコマンドを実行することで、main_cpp.callgraph.dot

    clangでコールグラフを出力 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "macにプリインストールされているllvmではoptコマンドが入っていないので、homebrewを使ってインストール / opt自体はllvmの各パスを調査するためのツール / -dot-callgraph: dot形式でグラフを出力" 2020
  • 列挙型(enum)の値と識別子を出力する技 - Qiita

    enumの値と識別子を出力したい場合に面倒になるのが、値から識別子へ文字列変換です。 識別子と、識別子の文字列リテラルの両方を書く必要がある(同じことを2回書く面倒) if文やcase文で同じ判定を存在する識別子分かかないといけない(似たことたくさん書く面倒) 上の2つを識別子が増えるたびに繰り返すことになる(面倒が続く) CやC++のPreprocessorのマクロには引数を文字列リテラルに変換する機能があり、これを使うとコーディングが楽になります。今回はenum値の出力に応用していますが、コツをつかむといろいろ応用が効きます。 マクロなのでCでもC++でも使える 識別子を1回書くだけでよい ifやcaseの繰り返しもマクロで置換する 識別子を増やしても軽微な修正で済む ソースコード(マクロなし) 正攻法でちゃんと書いた例。記述量が多くなり、また、変更が入ったときにはメンテも大変そうです

    列挙型(enum)の値と識別子を出力する技 - Qiita
    sh19910711
    sh19910711 2024/06/18
    "enumの値と識別子を出力したい場合に面倒になるのが、値から識別子へ文字列変換 / if文やcase文で同じ判定を存在する識別子分かかないといけない(似たことたくさん書く面倒) + 識別子が増えるたびに繰り返すことに" 2022
  • llvm-hs-pure で遊んでみる - Qiita

    llvm-hs-pure と llvm-hs-pretty を使って遊んでみたので、備忘録として情報を残しておきます。 はじめに llvm-hs は LLVM API と Haskell の間を繋いでくれるライブラリです。 llvm-hs は llvm-hs と llvm-hs-pure の2つのコンポーネントからなり、前者は LLVM API の FFI バインディングを、後者は LLVM の世界を表現する Haskell の型および関数を提供します。バインディングと表現が分離されている構成上、llvm-hs を使用するには LLVM のインストールが必要な一方、llvm-hs-pure には LLVM のインストールは要求されません。 さらに別のライブラリとして llvm-hs-pretty というものがあり、これは llvm-hs-pure の LLVM IR による pretty

    llvm-hs-pure で遊んでみる - Qiita
    sh19910711
    sh19910711 2024/06/18
    "簡単な言語(四則演算のできる計算機)のコンパイラを実装 / llvm-hs: LLVM API と Haskell の間を繋いでくれるライブラリ / llvm-hs-pure: LLVM の世界を表現する Haskell の型および関数を提供" 2022