2017-03-08 16 views
-1

入力としてCソースファイルを取り込み、すべての関数をインライン化し、別のCソースファイルを出力するツールはありますか?すべての関数をインライン化してCコードを取得

すべての機能は1つのファイルに含まれており、再帰/有効性はありません。関数は必ずしもinline属性を持つとは限りません。

このツールで標準ライブラリ(たとえばprintf,mallocsqrtなど)で宣言されている関数を無視すると問題はありません。

関連する質問:link:唯一の回答は間違っています。

+1

唯一の答えは間違っています。そのGCC特有の属性は宣伝されている通りです。 – StoryTeller

+2

それは間違いではない、それはちょうどこの質問が何をしていない(全く異なる質問なので)。 –

+1

IMO不可能でも無意味でもあります。引数の引き渡しが不要で、変数が呼び出し元と呼び出し先の間で共有されるため、インライン展開が機能します。このプロセスは、コンパイラおよびアーキテクチャに依存する(レジスタ)割り当てに依存する。例:32個のレジスタを持つマシンでインライン展開し、少ない数のマシンで前処理されたコードをコンパイルするとどうなるか想像してみてください。 – wildplasser

答えて

1

それはあなたを助けません。少なくともgccでは、テキストソースコードが内部表現に変換された後にインライン展開が行われます。

あなたはこれを見てとることができ

int x; 

__attribute__((always_inline)) inline void foobar() { x--; } 

int main() { 
    x = 1; 
    foobar(); 
    return x; 
} 

になります。この上g++ example.cpp -O0 -g -Eを呼び出す:

✓ pan:~$ g++ example.cpp -O0 -g -E 
# 1 "example.cpp" 
# 1 "/home/meyer//" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "example.cpp" 
int x; 

__attribute__((always_inline)) inline void foobar() { x--; } 

int main() { 
    x = 1; 
    foobar(); 
    return x; 
} 

しかしg++ example.cpp -O0 -g -o example.elfでコンパイルするとき、生成される実行可能ファイルはもう機能foobarを持っていません。 。 objdump -w | lessで確認し、属性を省略する場合と比較することができます。

-O0を使用して、ほとんどのコンパイラーが、機能が自明にint main() { return 0; }に最適化されていることが分かります。

あなたがそこでやろうとするもののツールがあるかどうかわかりません。しかし、私はC + +を意識したレクサー/パーサーの組み合わせが必要なのではないかと危惧しています。

関連する問題