文字列とは何ですか?文字の配列。
文字とは何ですか?整数です。
私はLLVMの専門家ではありませんが、たとえば、いくつかの8ビット文字セットを表現したい場合は、i8(8ビット整数)の配列を使用すると思います。またはi8へのポインタ。そして実際、私たちは、単純なHello WorldのCプログラムがある場合:
#include <stdio.h>
int main() {
puts("Hello, world!");
return 0;
}
を我々はLLVM-GCCを使用して、それをコンパイルし、生成されたLLVMアセンブリをダンプ:
$ llvm-gcc -S -emit-llvm hello.c
$ cat hello.s
; ModuleID = 'hello.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
target triple = "x86_64-linux-gnu"
@.str = internal constant [14 x i8] c"Hello, world!\00" ; <[14 x i8]*> [#uses=1]
define i32 @main() {
entry:
%retval = alloca i32 ; <i32*> [#uses=2]
%tmp = alloca i32 ; <i32*> [#uses=2]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
%tmp1 = getelementptr [14 x i8]* @.str, i32 0, i64 0 ; <i8*> [#uses=1]
%tmp2 = call i32 @puts(i8* %tmp1) nounwind ; <i32> [#uses=0]
store i32 0, i32* %tmp, align 4
%tmp3 = load i32* %tmp, align 4 ; <i32> [#uses=1]
store i32 %tmp3, i32* %retval, align 4
br label %return
return: ; preds = %entry
%retval4 = load i32* %retval ; <i32> [#uses=1]
ret i32 %retval4
}
declare i32 @puts(i8*)
お知らせputs関数への参照を宣言ファイルの終わりに。 Cにおいて、LLVMで
int puts(const char *s)
で置き、それは対応
i32 @puts(i8*)
であることは明らかです。
私が最適化せずにコンパイルしたので、生成されたLLVMは非常に冗長です。あなたがそれらを有効にした場合、不要な命令が消える:
$ llvm-gcc -O2 -S -emit-llvm hello.c
$ cat hello.s
; ModuleID = 'hello.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
target triple = "x86_64-linux-gnu"
@.str = internal constant [14 x i8] c"Hello, world!\00" ; <[14 x i8]*> [#uses=1]
define i32 @main() nounwind {
entry:
%tmp2 = tail call i32 @puts(i8* getelementptr ([14 x i8]* @.str, i32 0, i64 0)) nounwind ; <i32> [#uses=0]
ret i32 0
}
declare i32 @puts(i8*)
うーん、大丈夫です - もし私が今日のような多くの翻訳された言語のような文字列を使用したいのであれば(配列だけではなく長さなども含む)、余分な手荷物を運ぶ何らかの構造として宣言する必要があります。バックエンドにまったく新しいタイプであること –
うん、それは基本的には正しいですが、バックエンドに新しいタイプである必要はありません。 LLVM構造体を使用して必要なデータを格納し、文字列ラッパーに作用するいくつかの関数を定義することができます。 Zifre氏のように、実際には低レベルの仮想マシンです。 –
さて、私はllvmで素敵な小さな配列を作ることができることを知りましたが、これらの配列を別のサイズにどのように再配置するかはわかりませんでした。 string longer) –