雑記

・某氏と会話してて、ますますoccの開発を加速せねばという気持ちに。 ・しかし残念ながら今は全リソースを学園祭準備に割いていて、occの開発ができない。 ・つらぽよ ・というわけで、時はocc構造体サポートから止まっている。

c++のnewでの二次元配列作成方法

こんな構文書けるなんて初めて知ったよシリーズ、第二弾。 int size = 3; int (*i)[5] = new int[size][5]; delete[] i; こんなの、アリなんだね。

occ で構造体サポート

本当はOSCまでに構造体をサポートしたかったのですが、叶わず・・・ α0.13でようやく構造体を実装しました。サンプル:https://github.com/liva/occ/blob/release/sample/sample8.c構造体の中に構造体が入っていても大丈夫です。 内部構造は一般のアーキテク…

OSC行ってきたど

帰ってきたウルトラマ・・・もといOSASK計画の出典側のお手伝いとして参加してきた。 途中体調崩したけど、いろいろ楽しかった。・キャンプ関係者にいっぱい会えた! ・特にmafice君に会えたのが一番良かった ・<教訓>キャンプ講師陣に「僕の事覚えてます…

雑記

Twitterよりも自分のブログの方が人目に触れないのではと思ったので、あまり大きい声で言いたくない事はここに書こう。・webアプリなんて書かなくて良い、webセキュリティなんて考える必要ない(XSS Free!)、そんな世界を僕は作りたい。 ・osecpuで全部解決で…

occ α0.10公開

・occとは? OSECPU用のC言語コンパイラ。 ちょうど1ヶ月前から作り始めて、ようやく公開できるレベルに達した。まだ未実装の機能が多いけど。 URL : https://github.com/liva/occ 現状で書けるコードはこんな感じ:https://github.com/liva/occ/tree/relea…

コンパイラ

コンパイラを作るのって面白いよね。 自分が作ったコンパイラなら、どういうコードを書くとどういうバイナリを出力するか想像が付くから、最適化とかも捗りそう。

C言語よくわからん

C言語初心者です。void func1() { void func2() { } func2(); }こんなプログラムを書いても、gccさんは何も文句を言わずにコンパイルしてくれるんですね。初めて知りました。まる 調子に乗ってこんなプログラム書いたら怒られました。struct Class { void In…

C言語コンパイラ作成演習

京大の資料で、C言語コンパイラを作る実習、ってのがあったんだけど、これどのくらいの期間で 作らなきゃいけないんだろうか。大学の他の勉強もやりながら1ヶ月くらいで組む、といった所か。う〜ん、うちの大学の情報系学科も、このくらいやらせられるんだ…

occ開発メモ

・関数コール時のスタック退避はStage3で ・最適化 四則演算 ラベル統合 レジスタ流用、統合 条件式変換省略 条件無しラベルジャンプ後は次のラベルまで全消去 PALMEM系0x3F最適化(Stage2) ・仕様 プロトタイプ宣言の無い関数呼び出しはできない 関数ポイ…

LLVMは万能の杖か?

LLVMでOSECPUを吐かせようとこの一ヶ月頑張ってきたのだけど、結論から言うと、諦める事にした。 LLVMでOSECPUを吐く事は技術的には可能だと思うから、やりたい人がいれば是非チャレンジしてもらいたい。 だけど、僕はLLVMでOSECPUを吐く事に対する価値を見…

cygwin64bitでllvmをコンパイル

__deregister_frameが定義されてない参照です〜、みたいなエラーがでるんだよね。 ぐぐったら、こんなのを見つけた。https://github.com/mono/llvm/pull/1/files__deregister_frameと__register_frameを参照してる行を削除したらコンパイルは通った。 JIT使…

256ビットCPU

流石に無茶

アドレス演算

OSECPUはメモリアクセスに弱い。 だからOSECPUでスタックアクセスしようとするとこうなる。 .file "t3.bc" .text .globl _main .align 4 .type _main,@function _main: // @main // BB#0: LIMM(r1,-20); //imm32 PADD(p27,p27,r1); LIMM(r0,0); //imm7 LIMM(…

即値アドレス指定禁止

int *t = (int *)0x1000;こんな構文、OS作ってる人じゃなきゃ普通は使わないと思う。 とういわけでOSECPUではこんな構文は存在しない。だったら、こんな構文、コンパイル段階でエラーになるべきだよね。 /cygdrive/z/llvm/bin/llc -march=bfin -relocation-m…

アセンブラ談義

汎用コンテナの所まで後ずさりしてLLVMをやってる。Blackfinを改造してこんなコードを吐かせた。 .file "t2.bc" .text .globl _main .align 4 .type _main,@function _main: // @main // BB#0: sp += -24; LIMMimm7p(p0,0); //(゚Д゚)ハァ? LIMMimm7p(p1,-3); //…

バグ、大体特定できた

行き詰まったら寝かせるのがヨロシ。 液晶の前でウンウン唸ってても時間の浪費ですからね。というわけで、OSECPUで詰まってた所、大体解決しました。 jitCompA0001_movReg32EbpDisp(w, 0 /* EAX */, 256 + pxx * 32);こういうコード、256 + pxx * 16にしなき…

つらぽよ

ポインタ、結局128ビットで落ち着く事になったんだけど、128ビット化のパッチ当てたらバグった・・・ OSECPUがJITコンパイルする関係で、バグの特定が結構難しいんだよなぁ。どうしよ。

ポインタの扱いその2

256ビットの何が嫌かって、コピーする時に32バイトをバンバンコピーするのがなぁ。 OSECPUはメモリアクセス系命令が貧弱だから、スタックアクセスの時にヤバイ事になる気がする。・・・う〜ん、ここはLMEMiとかを作るかなぁ。そっち方面で拡張しようかしらん…

ポインタの扱い

大学の試験勉強と並行してやっているので、あまり進んでないけど、ポインタの扱いを改良している。今考えているポインタの実装法は大まかに分けて3種類あって、各実装法におけるポインタサイズは、以下のとおり・32ビット ・64ビット ・256ビット(OSECPU共…

MIDUHA

OSECPU派生プロジェクト、MIDUHA(MIDUHA-VM)と呼ぶ事にする。

OSECPUコードリーディング

自分用メモ。P3Fは、たぶん割り当てられた256ビット領域を全く使ってない。

OSECPU派生プロジェクト始動?

今LLVMからOSECPUバイナリを吐こうとしているのですが、現在のOSECPUの仕様ではどうも都合が悪いのです。 最初はOSECPUにパッチを当てる事で実現させようかと思っていたのですが、OSECPUの改変箇所がかなり多いので、 いっその事OSECPUとはプロジェクトを分…

スタック二本

前に同じサイズのスタックを二本用意する、ってアイディアを書いたけど、これはOSECPUのセキュリティの考え方からすると アウトなのでボツにする。スタックを二本用意するなら、ポインタ専用とデータ専用をそれぞれ用意すべき。 ただ、これをLLVMで実装…

OSECPU funcf6を読む

自分用メモ。 jitCompA000_dataWidth(jitCompA000_convTyp(r->ireg[typ]))mallocのreg0にT_VPTRを指定したら、256が取れる。 widthはこれを8で割った物、つまりバイトですな。T_VPTRは32バイトですよっと。その後は返すポインタレジスタの設定。i1は32バイト…

OSECPUにおける既存リソースの活用は可能か?

たぶん難しいと思うんだよね。 だって、ほら、ポインタとデータをごちゃ混ぜにしたコードをどうやって移植すんのら、と。LLVMがOSECPUアーキテクチャーに対応したとして、ライブラリ等は書き直した方が早いよなー。

スタックを二本用意する

簡単そうに見えるけど、意外と難しい。妥協すればたぶん何とかなる。普通、データもポインタもごちゃ混ぜにしてスタックを確保するんだけど、その時のスタックサイズと同じ大きさのスタックを二つ用意する。 取り出す値によって、スタックレジスタを切り替え…

某キャンプの感想記事

前に書いたエントリ、短いのは良いけど、凄くバカっぽい文章だし、マトモな事何も書いてないから、 もうちょっと真面目に書いた方が良いのかなぁ、なんて思ったのです。だって、他の参加者やチューターさん、 みんな真面目に書いてるんだもん。 ・・・だけど…

Blackfin大好き!

Blackfinというアーキテクチャがありましてですね。 .file "t2.bc" .text .globl _main .align 4 .type _main,@function _main: // @main // BB#0: sp += -32; r0 = 0 (x); [sp + 28] = r0; r0 = 3 (x); [sp + 24] = r0; r0 = 5 (x); [sp + 20] = r0; r1 = […

data register & pointer register

データレジスタとポインタレジスタが完全分離されているアーキテクチャのLLVMバックエンド実装に 困っていたんだけど、調べてみたら実装例が出てきたから上手く行きそう。