0

私はllvmフロントエンドを開発しています。私の問題は、「ストア」命令を使用して複合型のメンバーに値を格納すると、セグメンテーション違反が発生することです。たとえば、モジュールで %mytype = type {i32, ...} のような型を定義したと仮定し、次のコマンドを使用して、この型のオブジェクトの最初のフィールドに 3 を格納します。seg fault を引き起こすこのコードの何が問題なのですか?

define void f() {
...
%alloc = alloca %mytype*
%myinstance = load %mytype** %alloc
%firstfield = getelementptr %mytype* %myinstance, i32 0, i32 0
store i32 3, i32* %firstfield
...
)
4

1 に答える 1

1

問題は、ポインターが指すものを割り当てずにポインターを割り当てたことです。そのため、そのポインターを逆参照しようとするとセグメンテーション違反が発生するのも不思議ではありません。

あなたがする必要があるのは

%alloc = alloca %mytype
%firstfield = getelementptr %mytype* %alloc, i32 0, i32 0
store i32 3, i32* %firstfield

何らかの理由でポインタを割り当てる必要がある場合、つまり、%mytype**割り当てられたメモリへのポインタがあるメモリ位置を指す値が必要な場合は、上記に追加することもできます。

%ptrptr = alloca %mytype*
store %mytype* %alloc, %mytype** %ptrptr
于 2013-01-20T07:54:06.220 に答える