루프의 유형이 다른 경우 이름으로 쉽게 식별 할 수 있지만 동일한 유형의 루프가 여러 개있는 경우 (예 : 5 while
루프) LLVM IR의 기본 블록이 어떤 루프에 해당하는지 식별 할 수 있습니까 소스 코드?함수 아래에있는 여러 개의 동일한 유형 루프를 LLVM IR의 생성 된 기본 블록에 매핑하는 방법은 무엇입니까?
우리는 코드와 LLVM IR을 순차적으로 방문하면서 손쉽게 식별 할 수 있지만 프로그래밍 방식으로 식별 할 수있는 방법을 찾고 있습니다.
; ModuleID = 'abc.c'
source_filename = "abc.c"
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.0.23026"
; Function Attrs: noinline nounwind uwtable
define i32 @main() #0 {
entry:
%retval = alloca i32, align 4
%count = alloca i32, align 4
store i32 0, i32* %retval, align 4
store i32 1, i32* %count, align 4
br label %while.cond
while.cond: ; preds = %while.body, %entry
%0 = load i32, i32* %count, align 4
%cmp = icmp sle i32 %0, 4
br i1 %cmp, label %while.body, label %while.end
while.body: ; preds = %while.cond
%1 = load i32, i32* %count, align 4
%inc = add nsw i32 %1, 1
store i32 %inc, i32* %count, align 4
br label %while.cond
while.end: ; preds = %while.cond
br label %while.cond1
while.cond1: ; preds = %while.body3, %while.end
%2 = load i32, i32* %count, align 4
%cmp2 = icmp sgt i32 %2, 4
br i1 %cmp2, label %while.body3, label %while.end4
while.body3: ; preds = %while.cond1
%3 = load i32, i32* %count, align 4
%dec = add nsw i32 %3, -1
store i32 %dec, i32* %count, align 4
br label %while.cond1
while.end4: ; preds = %while.cond1
ret i32 0
}
attributes #0 = { noinline nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"clang version 4.0.0 (tags/RELEASE_400/final)"}
지금 두 가지가 있습니다 : 나는 fileName.ll은 아래의 내용으로 만들 수있어 COMAND clang -S -emit-llvm fileName.c
을 실행할 때
int main()
{
int count=1;
while (count <= 4)
{
count++;
}
while (count > 4)
{
count--;
}
return 0;
}
:
예, 나는 C에서 아래의 소스 코드를 주어진 소스 파일에 대해 생성 된 기본 블록을 while.cond
및 while.cond1
으로 만들면 소스 코드에서 어떤 기본 블록이 어떤 루프인지 식별 할 수 있습니까?
'getAnalysis()'메소드에 포함시킬 헤더 파일을 도와주십시오. –
'getAnalysis' 메소드는 모든 패스 클래스에 상속되므로 쉽게 사용할 수 있습니다. 'LoopInfoWrapperPass'는'llvm/Analysis/LoopInfo.h'에서 구할 수 있습니다. 나는'grep'이나 LLVM 소스 트리에서 비슷한 도구를 사용하는 것이 많은 도움이된다고 생각합니다. – compor
[this] (https://github.com/compor/AnnotateLoops) repo를 살펴볼 수도 있습니다. 루프에 숫자 ID를 주석으로 표시합니다. 그에 따라 적응할 수 있습니다. – compor