llvmgetelementptrが間違った値を取得しています

ジュピース

llvm getelementptr命令を学習していて、構造体から要素を取得しようとしています。私の構造体はこんな感じです

struct Foo {
    int32_t a;
    int32_t b;
    int32_t c;
};

対応するllvmタイプ:

Type *getType() {
    vector<Type *> tps;
    tps.push_back(Type::getInt32Ty(TheContext));
    tps.push_back(Type::getInt32Ty(TheContext));
    tps.push_back(Type::getInt32Ty(TheContext));
    StructType *tp = StructType::create(TheContext, tps, "foo_type");
    return tp;
}

とテスト機能、

%foo_type = type { i32, i32, i32 }

define i32 @_func_(%foo_type) {
entry:
  %1 = alloca %foo_type
  store %foo_type %0, %foo_type* %1
  %2 = getelementptr %foo_type, %foo_type* %1, i32 0, i32 1
  %3 = load i32, i32* %2
  ret i32 %3
}

しかし、コンパイルされた関数を実行すると、常に3番目の要素であるFoo :: cが取得されますが、Foo :: bは取得されないので、コードの何が問題になっていますか?問題はストアの指示かもしれないと思います。

ここで完全な作業プログラム

2019.12.13を編集

パラメータとしてポインタを渡すことで、正しい答えが得られます

define i32 @_func_(%foo_type*) {
entry:
  %1 = alloca %foo_type*
  store %foo_type* %0, %foo_type** %1
  %ptr = load %foo_type*, %foo_type** %1
  %2 = getelementptr %foo_type, %foo_type* %ptr, i32 0, i32 1
  %3 = load i32, i32* %2
  ret i32 %3
}

したがって、問題は、以前のバージョンでコンパイルされた関数にFP(f)実際に渡さfれていないことであるに違いありません

ジュピース

関数をcで記述し、clangにIRを出力させると、次のように表示されます。

struct Foo {
    int a;
    int b;
    int c;
};

int bar(Foo f) {
    return f.b;
}

define dso_local i32 @_Z3bar3Foo(i64, i32) #0 {
  %3 = alloca %struct.Foo, align 4
  %4 = alloca { i64, i32 }, align 4
  %5 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 0
  store i64 %0, i64* %5, align 4
  %6 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 1
  store i32 %1, i32* %6, align 4
  %7 = bitcast %struct.Foo* %3 to i8*
  %8 = bitcast { i64, i32 }* %4 to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %7, i8* align 4 %8, i64 12, i1 false)
  %9 = getelementptr inbounds %struct.Foo, %struct.Foo* %3, i32 0, i32 1
  %10 = load i32, i32* %9, align 4
  ret i32 %10
}

つまりそれ自体ではなく、bar(Foo())実際にパラメータとして受け入れint64int32いるというFooことです。それは私があまり知らないいくつかのc / cppABIかもしれません。

しかし、ポインタを渡す場合、そのような問題はないので、期待どおりに機能します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

文字列が間違った値を取得しています

分類Dev

printf()が間違った値を出力しています

分類Dev

MySQL関数が間違った値を返しています

分類Dev

difftimeが間違った数値を返しています

分類Dev

SelectmaxがMySQLで間違った値を返しています

分類Dev

連想配列から取得した値が間違っていますか?

分類Dev

jQueryの幅が間違った値を取得している

分類Dev

動的なTestNGXMLの作成。間違ったXMLを取得しています。私が間違っているところ

分類Dev

Edittext.Textは正しい値を示していますが、間違った値を使用しています

分類Dev

Array.find()は正しい値を取得しますが、間違った値を返します

分類Dev

IMが間違った出力plsヘルプを取得しています>>>>>

分類Dev

比較した mySQL の値が間違っています

分類Dev

SQL Server:合計関数が間違った値を返しています

分類Dev

this.setState()が状態を間違った値に変更しています

分類Dev

Jqueryオフセットが間違った値を返しています

分類Dev

非表示のフォームが間違った値を送信しています

分類Dev

価格の合計が間違った値を示しています

分類Dev

価格の合計が間違った値を示しています

分類Dev

日付比較が間違った値を返していますか?(迅速)

分類Dev

Bashスクリプトが間違った値を出力しています

分類Dev

日付解析が間違った値を与えています

分類Dev

numpy SVDが間違った値を与えていますか?

分類Dev

qSin()が間違ったsin値を与えていますか?

分類Dev

間違った出力を取得していますか?

分類Dev

updated_atを使用したSELECT WHEREが間違っています

分類Dev

phpdate_createが間違った年を示しています

分類Dev

ElasticsearchMatchQueryが間違った結果を返しています

分類Dev

Laravel ShowResourceが間違った列を検索しています

分類Dev

Python XMLfindallが間違ったものを返しています

Related 関連記事

  1. 1

    文字列が間違った値を取得しています

  2. 2

    printf()が間違った値を出力しています

  3. 3

    MySQL関数が間違った値を返しています

  4. 4

    difftimeが間違った数値を返しています

  5. 5

    SelectmaxがMySQLで間違った値を返しています

  6. 6

    連想配列から取得した値が間違っていますか?

  7. 7

    jQueryの幅が間違った値を取得している

  8. 8

    動的なTestNGXMLの作成。間違ったXMLを取得しています。私が間違っているところ

  9. 9

    Edittext.Textは正しい値を示していますが、間違った値を使用しています

  10. 10

    Array.find()は正しい値を取得しますが、間違った値を返します

  11. 11

    IMが間違った出力plsヘルプを取得しています>>>>>

  12. 12

    比較した mySQL の値が間違っています

  13. 13

    SQL Server:合計関数が間違った値を返しています

  14. 14

    this.setState()が状態を間違った値に変更しています

  15. 15

    Jqueryオフセットが間違った値を返しています

  16. 16

    非表示のフォームが間違った値を送信しています

  17. 17

    価格の合計が間違った値を示しています

  18. 18

    価格の合計が間違った値を示しています

  19. 19

    日付比較が間違った値を返していますか?(迅速)

  20. 20

    Bashスクリプトが間違った値を出力しています

  21. 21

    日付解析が間違った値を与えています

  22. 22

    numpy SVDが間違った値を与えていますか?

  23. 23

    qSin()が間違ったsin値を与えていますか?

  24. 24

    間違った出力を取得していますか?

  25. 25

    updated_atを使用したSELECT WHEREが間違っています

  26. 26

    phpdate_createが間違った年を示しています

  27. 27

    ElasticsearchMatchQueryが間違った結果を返しています

  28. 28

    Laravel ShowResourceが間違った列を検索しています

  29. 29

    Python XMLfindallが間違ったものを返しています

ホットタグ

アーカイブ