9

llvm IRのラベル識別子がコンマ';'で始まって ; <label> 6 いることに気付くことがありますが、私が知っているように、コンマはコメントに使用されます。では、llvmはコメント内のラベル情報をどのように取得できますか?私は何かが足りないのですか?
1つの簡単なテストが続きます。
Cソースファイル:

#include <stdio.h>

int main()
{
 int a;
 scanf("%d", &a);
 if ( a > 3)
  a *= 2;
 return 0;
}

http://llvm.org/demo/index.cgi(clang -c -emit-llvm main.cと同じ)によって生成されたllvmIRコードは次のとおりです。

; ModuleID = '/tmp/webcompile/_13654_0.bc'

@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1

define i32 @main() nounwind uwtable {
  %a = alloca i32, align 4
  %1 = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), i32* %a) nounwind
  %2 = load i32* %a, align 4, !tbaa !0
  %3 = icmp sgt i32 %2, 3
  br i1 %3, label %4, label %6

; <label>:4                                       ; preds = %0
  %5 = shl nsw i32 %2, 1
  store i32 %5, i32* %a, align 4, !tbaa !0
  br label %6

; <label>:6                                       ; preds = %4, %0
  ret i32 0
}
4

3 に答える 3

7

LLVM IRでは、ブロックに明示的なラベルは必要ありません。指示は、%1、%2、%3につながる同じ方法です。LLVMは、名前のない命令とブロックに昇順で番号を割り当てます。は最初のbr i1 %3...ブロックを終了し、最後に使用された番号ラベルは3であるため、次のブロックには4のラベルが付けられます。そのブロックは次のbr命令で終了し、最後に使用された番号は5であるため、次の最後のブロックには6のラベルが付けられます。ブロックと命令が同じ名前空間を共有しているのは奇妙に思えるかもしれませんが、ブロックも値であることを忘れないでください。

于 2012-03-19T16:00:00.653 に答える
2

言葉遣いにもかかわらず、%4inlabel %4はラベルではなく、ブロックへの単なる参照です。あなたは正しいです、これは非常に紛らわしいです、議論のためにこの問題を見てください。

于 2013-12-19T13:47:26.083 に答える
1

試すことができるのは、IRでinstnamerパスを実行することです。これにより、すべてに明示的な名前が付けられるため、暗黙的な名前を見つけることを心配する必要はありません。

于 2014-06-16T20:40:15.320 に答える