ライブラリをコンパイルしてLLVM-IRを出力する方法
皆さんご存知、LLVM-IRはコンパイラ基盤であるLLVMの中間生成物であり、emscriptenやPROCESS WARPはLLVM-IRを読み込んで動かすことができるプラットフォームです。 現代のプログラミングでは既存ライブラリを利用することにより開発期間の短縮や品質向上を図っています。前述のプラットフォームでプログラムを動かす場合、自分のプログラムをLLVM-IRに変換するわけですが、その過程で依存ライブラリも同様にLLVM-IRに変換する必要があります。
$ clang -emit-llvm -c hoge.c
上記コマンドでC/C++からLLVM-IRへの変換はできていましたが、autoconfなどのビルドツールでは同様の方法では対応できませんでした。このような場合には-fltoオプションを使うとうまくいくようです。
The LLVM gold plugin — LLVM 3.8 documentation
GMPというライブラリを例にLLVM-IRの塊を取り出してみます。 GMPはC/C++で任意精度の整数、小数演算を行うためのライブラリです。標準C/C++ライブラリ以外にほとんど依存しません。
前提
- OS X Yosemite Version 10.10.5
- clang Apple LLVM version 7.0.0 (clang-700.1.76)
- LLVM 3.6.2 (homebrewでインストル済み)
- GMP 6.1.0 (.tar.bz2ファイルをダウンロード、解凍しておく)
コンパイル作業
$ cd <gmpの展開先> $ CC="clang -flto" CXX="clang++ -flto" ./configure --disable-shared <省略> $ make <省略>
GMPは通常、共有ライブラリと静的ライブラリの両方をコンパイルします。LLVM-IRを取り出す場合、静的ライブラリだけあればOKなので--disable-sharedオプションを指定しています。 GMPの場合、.libフォルダ以下にコンパイル済みライブラリが格納されています。
$ cd .lib $ ls libgmp.a libgmp.la libgmp.lai
静的ライブラリlibgmp.aにはLLVM-IRのBitCodeが含まれています。一旦arを展開し、中のBitCodeを取り出します。
$ mkdir work $ cd work $ llvm-ar x ../libgmp.a $ ls <libgmp.aに格納されていた.oファイルが展開されているはず>
展開された.oファイルはただのオブジェクトファイルではなくBitCodeです。 llvm-disコマンドでヒューマンリーダブルな.llファイルに変換できます。
$ find *.o -exec llvm-dis {} \;
あとはllvm-linkコマンドで1つにまとめて終わりです。
$ llvm-link -o ../libgmp.bc *.ll $ cd .. $ llvm-dis libgmp.bc $ ls libgmp.a libgmp.bc libgmp.la libgmp.lai libgmp.ll work
失敗談
fltoオプションの存在に気づくまで、emscriptenのようにCCにラッパを流し込んでなんとかしようとしていました。 基本動作は以下のとおりでスクリプトを組んだのですが、autoconfの関数有無の判定はプログラムがリンクまで正常に行えるかを基準にしています。 LLVM-IRの出力までで処理を止めた場合、関数がなくともリンク相当のコマンドが正常終了し、存在しない関数が有ると判定しmakeで止まるとうい問題が発生しました。 その時の調査で-fltoオプションを見つけて無事ライブラリのLLVM-IRを出力できることが分かりました。 ここまで来るのに2日ほどかけてgcc/clang/emcc/autoconfの動作をトレースしたんですけどね… 以下は必要なくなったラッパプログラムです。
#!/usr/bin/env python # coding:utf-8 import subprocess import sys import re import os import stat i_name = False o_name = False o_name_idx = False is_c = False is_e = False is_o = False is_s = False s_idx = False # 起動引数を読み取って、-c, -o, -S関連の有無と場所を確認 for idx, arg in enumerate(sys.argv): if is_o == True and (not o_name): o_name = arg o_name_idx = idx matched = re.match(r"^(.*)\.(c|i|cpp|cxx|cc|c\+\+|ii|s)$", arg) if matched: i_name = matched.group(1) if arg == "-c": is_c = True if arg == "-E": is_e = True if arg == "-o": is_o = True if arg == "-S": is_s = True s_idx = idx # 起動引数をコピーしてコマンドを作成 command = sys.argv[:] # command[0] = "clang" # -Sオプションの場合は-cで上書きする if is_s: command[s_idx] = "-c" # プリプロセッサ出力の場合を除き、出力形式に合わせて出力ファイル名を決定 if not is_e: if is_o: # 実行可能形式でのコンパイルをしようとした場合は、hoge.00に出力 if not is_c and not is_s: command[o_name_idx] = o_name + ".00" else: command.insert(1, "-o") if is_s: # アセンブラやオブジェクトファイルの場合は # .s, .oファイルを出力(中身はLLVM-IR) command.insert(2, i_name + ".s") elif is_c: command.insert(2, i_name + ".o") else: # 実行可能形式でファイル名が指定されない場合はa.out.00に出力 o_name = "a.out" command.insert(2, o_name + ".00") # コンパイルオプションに-emit-llvmを付加する command.insert(1, "-emit-llvm") command.insert(2, "-c") command.insert(3, "-fno-vectorize") # set target command.insert(1, "-m64") proc = subprocess.Popen( command, shell = False, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) stdout_data, stderr_data = proc.communicate() print stdout_data print stderr_data # 実行可能形式でのコンパイルの場合、LLVM-IRを # 実行するクッションスクリプトを作成 # @todo リンクオプションをlliに渡すようにする if not is_c and not is_e and not is_s: f = open(o_name, "w") f.write("#!/usr/bin/env sh\n") f.write("/usr/local/Cellar/llvm/3.6.2/bin/lli " + o_name + ".00 \"$@\"\n") f.close() os.chmod(o_name, stat.S_IRWXU) sys.exit(proc.returncode)
デザインに凝り過ぎた名刺は名刺スキャナ通らなかった
Evernoteでは名刺をスキャンする機能(名刺を写真で取ると取り込む)があります。 チョットデザインに凝ったものは失敗することが多いのでポイントをリストアップしました。
- コントラストは高め。
- ゴシック、明朝は読み取り精度に影響が少ないようだが、手書き風フォントは精度が落ちる(ただし英語名刺の場合は奇抜でなければ読み取り精度が高い)。
- 文字サイズは、よほど小さい場合以外は問題ない。
- 片面だけで名前、所属、連絡先の基本情報を全て記載する。
- 会社理念などを基本情報と同じ面にデザインすると認識精度が低くなる。
- 紙は矩形。角丸や独創的な形の名刺は台形補正が失敗する。
- 同様の理由で高コントラストの非矩形枠線も失敗要因になる。
- 横書き推奨。
- 他国産アルゴリズムでは縦書きの認識精度が低い。
- 斜めの場合も認識精度が低い。
- 1カラム構成が望ましい。2カラムの場所は左右でフォントサイズを変更する(役職と名前とか)。本社支社で2カラム構成はNG。
気づいたことがあったら加筆します。
PIAXで作る P2Pネットワーク
CMU #33で「PIAXで作るP2Pネットワーク」という題目で発表してきました。
メモ
- やっぱJavaScriptで使えればな〜という雰囲気があった。
PROCESS WARPが総務省異能vationプログラムの最終選考を通過しました。
ご助力、応援いただいている方々に御礼を申し上げるとともに、自分が何をするのか、したいのか、どうするかを見つめなおす機会でもあるなと思いました。
第48回 情報科学若手の会に行ってきました。
情報科学若手の会に参加してきました。雰囲気、内容ともに、とても充実した会でした。
- 情報科学若手の会
情報処理学会プログラミング・シンポジウムに関連する会だそうです。
- 学生、社会人が半々くらい、10台末〜30台前半くらい、31の自分は高齢者でした。
- 大学時代の学会発表ほどフォーマルではないが、研究や実戦投入を元にした話題が多いです。勉強会やプレゼン大会の濃いところだけを集めた感じで、総じてレベルが高いです。
- プレゼン→交流イベント→懇親会→プレゼン→懇親会→プレゼンの3日間。懇親会が26時以降まで続くので体調を整えて参加のこと。
- 学生社会人問わず、プログラミングやネットワーク、組み込みなど、技術大好き。
- 表立って話せない事も結構ありました。内容紹介はスライドが出ている範囲にフィルタしています。
- ぜひ行ってみたい人用に次回のお知らせを受け取れるサービスがあります。
はじめてでもわかる!IoT の過去・現在・未来(湯村翼さん)
www.slideshare.net
- もやっとしたIoTについて事例を通して紹介、技術の流れを追いながら今後どうなるかについて。
- 電脳社会論という本があるから読もう!って絶版してた。
- 研究→製品化のスパンが短くなっている(5年未満もザラ)。面白い分野だけど、研究でやるなら流行りに飛びつかず先を見据えて行わないと、研究終了時に陳腐化している可能性がある。
- お家ハックナイトというイベントがあるので、興味があるなら参加しよう。
- 最近、IoT分野に閉塞感がある。デバイスはあるけど何ができるようになったのか、利用者へのメリットが示せているのか?
- IoT家電は通信規格バラバラでは消費者は手が出ない。
IoT で進化するミツバチとの交流(畑昌宏さん)
- 銀座でもミツバチを飼っており、はちみつの地産地消が行われている。
- 巣箱の管理、スズメバチの撃退をIoTを活用して行うための開発(センサ & 箱)を行っている。
- 意外にも、参加者の周辺でも蜂を飼っている人が数名いた。
- ハルロックという漫画にいろいろヒントが有るらしい。
- 蜂にかぎらず、農業分野でのセンサは、かなり共通化できそう。GPIOに接続可能で安価なセンサモジュールが出回れば喜ぶ人が多そう。
Alloy で学ぶ形式手法(名渡山夏子さん)
- ガチガチじゃない形式手法で仕様の正しさを検証する。
- 昔使ったUMLベースの厳密な仕様証明ソフトと違い、最も単純(そう)な仕様違反パタンの例示をしてくれる(っぽい)
- プログラムの仕様だけでなく、数学証明やパズルの解もできる(アルゴリズムに落としこむことで)
- 分散処理で個別のエージェントの状態遷移を記述すればプロトコルの妥当性検証もできそう。
ぼくらのプログラミングから、みんなのプログラミングへ(加藤淳さん)
http://junkato.jp/publications/wakate2015-kato-slides.pdf
- プログラム環境の進化は50年前から余り変わらない(文字ベースということで)
- インタラクティブ系はデバッグが大変(Kinect前で同じポーズを取ったつもりでも、入力信号的として異なっていたり)→DejaVuというシステムで入力信号を再現する環境を作成ナドナド
- TextAliveという歌詞アニメーション(カラオケで映るような映像)の作成(?)環境。
- JavaScriptでエフェクトをつくり、GUIでパラメタ編集もできるようにCUIとGUIを場面に合わせて共存できるような作り。
- 歌詞アニメーションに特化したからできることなのでは?→「特化開発環境を作る開発環境の開発、仕組みづくりができないか」とのこと。
HCI 分野の紹介と最新研究(太田佳敬さん)
- フィッツの法則などで、インタフェースの良し悪しを定量的に測ろうという試みがあった。
- 全てが数式化できるとは考えないが、ある程度計算できれば「どうしてこうなった」や「誰か止めなかったのか?」という事案が減りそう。
ISP の作り方(江草陽太さん)
- Home NOC Operator’s GroupでISPを作ろうというお話。
- 世界中のISP同士はBGPなど、教科書でしか見たこと無いプロトコルを使って経路制御をしている。
- IPとは異なるレベルでの経路制御の実装と事情が聞けたのはかなり貴重。
IT×宇宙で何をしよう!?(館下博昭さん)
- 招待講演。
- プレゼンが出ていなかったため名前のみ
Use Open Data with SPARQL(塚本英成さん)
www.slideshare.net
- Open Dataの基本(定義みたいなもの)
- 単に公開すればOKというものではなく、構造化されていてコンピュータで使いやすくなければ活用できない(が、日本の各自治体でそこまでやるには人金技術が不足)。→自社製品でExcelから色々な形式に変換できるよ♪
- SPARQL : RDF(よく調教されたOpen Dataのフォーマット)を検索、変換するためのクエリ言語、自治体ごとに異なるタグを統一したりもできる。
- 見せ方は技術で何とかなりつつある。問題になるのはシステムに入力するまで。その辺りに良いソリューションはないかな?
- 自治体は独自色を出したがるが、Open Dataは全てのフォーマットが統一されていることが大事。自治体で持ちにくいシステムは都道府県や国で整備して同じインフラを使わせるとかできないのかな?
ルータで斬り込め!おうちIoT(末田卓巳さん)
ルータで斬り込め!おうちIoT.pptx - Google ドライブ
- 家にあるルータをIoTのHubにしてしまえ!という話。
- 買ってきたままのルータではできないが、OpenWrtを使ってLinuxマシン化して、デバイスと繋いだり、アレコレできるとうい話。
- コンパイルが失敗したら警告灯を回したり、タイヤつけたりプロペラつけたり。
関係者の皆さん、ありがとうございます。 次回も参加したいです。
PROCESS WARPが総務省異能vationプログラムの一次選考を通過しました。
二次選考まであるので、手放しに喜べるわけではないですが、それでも嬉しいです。協力いただいている方々に感謝です。
新しい分散実行の仕組み PROCESS WARPについて
CMU #31で「新しい分散実行の仕組み PROCESS WARPについて」という題目で発表してきました。
www.slideshare.net
emscriptenについて発表してきた時より、うまく伝わらなかったと思いました。 以下次回以降へのメモ。
処理の概念(C/Sとの違い)
- 現在のインターネットの仕組み(C/S)について、1枚くらい説明し、目指している仕組み(分散)について述べたほうが良い?
- だれにでも分かるを目指して中途半端になるより、ドンドン深堀りしたほうが見ている人は面白いのだろうか?
分散処理の例
- Google内部は分散処理
一般で使える分散処理を目指すには
ヘテロ分散+プロセスマイグレーションがインフラとして存在する世界
- WikipediaがC/Sでなく分散処理だったら
- 攻殻機動隊を例に出しても、そのネットワークがスゲーという人は少ない、「え?どのあたり?」みたいになるようだ。
- 電脳って言うと、脳みそをチタンの頭蓋骨で囲ったアレをイメージするっぽい。
うーん、悩ましいです。