Skip to content

Instantly share code, notes, and snippets.

@n01e0
Last active September 10, 2019 09:31
Show Gist options
  • Save n01e0/255bbeceef9517ab82832ff8a282477b to your computer and use it in GitHub Desktop.
Save n01e0/255bbeceef9517ab82832ff8a282477b to your computer and use it in GitHub Desktop.
LLVM IRを読む
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+.+.>++++++++++.
; ModuleID = 'abc.bf'
source_filename = "abc.bf"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define i32 @input() #0 {
%1 = alloca i32, align 4
%2 = call i32 @getchar()
store i32 %2, i32* %1, align 4
%3 = load i32, i32* %1, align 4
%4 = icmp eq i32 %3, -1
br i1 %4, label %5, label %6
; <label>:5: ; preds = %0
call void @exit(i32 0) #4
unreachable
; <label>:6: ; preds = %0
%7 = load i32, i32* %1, align 4
ret i32 %7
}
declare i32 @getchar() #1
; Function Attrs: noreturn nounwind
declare void @exit(i32) #2
; Function Attrs: noinline nounwind optnone uwtable
define i32 @main() #0{
%1 = alloca i8*, align 8
%2 = call noalias i8* @malloc(i64 32767) #5
store i8* %2, i8** %1, align 8
%3 = load i8*, i8** %1, align 8
%4 = load i8, i8* %3, align 1
%5 = add i8 %4, 1
store i8 %5, i8* %3, align 1
%6 = load i8*, i8** %1, align 8
%7 = load i8, i8* %6, align 1
%8 = add i8 %7, 1
store i8 %8, i8* %6, align 1
%9 = load i8*, i8** %1, align 8
%10 = load i8, i8* %9, align 1
%11 = add i8 %10, 1
store i8 %11, i8* %9, align 1
%12 = load i8*, i8** %1, align 8
%13 = load i8, i8* %12, align 1
%14 = add i8 %13, 1
store i8 %14, i8* %12, align 1
%15 = load i8*, i8** %1, align 8
%16 = load i8, i8* %15, align 1
%17 = add i8 %16, 1
store i8 %17, i8* %15, align 1
%18 = load i8*, i8** %1, align 8
%19 = load i8, i8* %18, align 1
%20 = add i8 %19, 1
store i8 %20, i8* %18, align 1
%21 = load i8*, i8** %1, align 8
%22 = load i8, i8* %21, align 1
%23 = add i8 %22, 1
store i8 %23, i8* %21, align 1
%24 = load i8*, i8** %1, align 8
%25 = load i8, i8* %24, align 1
%26 = add i8 %25, 1
store i8 %26, i8* %24, align 1
%27 = load i8*, i8** %1, align 8
%28 = load i8, i8* %27, align 1
%29 = add i8 %28, 1
store i8 %29, i8* %27, align 1
%30 = load i8*, i8** %1, align 8
%31 = load i8, i8* %30, align 1
%32 = add i8 %31, 1
store i8 %32, i8* %30, align 1
%33 = load i8*, i8** %1, align 8
%34 = load i8, i8* %33, align 1
%35 = add i8 %34, 1
store i8 %35, i8* %33, align 1
%36 = load i8*, i8** %1, align 8
%37 = load i8, i8* %36, align 1
%38 = add i8 %37, 1
store i8 %38, i8* %36, align 1
%39 = load i8*, i8** %1, align 8
%40 = load i8, i8* %39, align 1
%41 = add i8 %40, 1
store i8 %41, i8* %39, align 1
%42 = load i8*, i8** %1, align 8
%43 = load i8, i8* %42, align 1
%44 = add i8 %43, 1
store i8 %44, i8* %42, align 1
%45 = load i8*, i8** %1, align 8
%46 = load i8, i8* %45, align 1
%47 = add i8 %46, 1
store i8 %47, i8* %45, align 1
%48 = load i8*, i8** %1, align 8
%49 = load i8, i8* %48, align 1
%50 = add i8 %49, 1
store i8 %50, i8* %48, align 1
%51 = load i8*, i8** %1, align 8
%52 = load i8, i8* %51, align 1
%53 = add i8 %52, 1
store i8 %53, i8* %51, align 1
%54 = load i8*, i8** %1, align 8
%55 = load i8, i8* %54, align 1
%56 = add i8 %55, 1
store i8 %56, i8* %54, align 1
%57 = load i8*, i8** %1, align 8
%58 = load i8, i8* %57, align 1
%59 = add i8 %58, 1
store i8 %59, i8* %57, align 1
%60 = load i8*, i8** %1, align 8
%61 = load i8, i8* %60, align 1
%62 = add i8 %61, 1
store i8 %62, i8* %60, align 1
%63 = load i8*, i8** %1, align 8
%64 = load i8, i8* %63, align 1
%65 = add i8 %64, 1
store i8 %65, i8* %63, align 1
%66 = load i8*, i8** %1, align 8
%67 = load i8, i8* %66, align 1
%68 = add i8 %67, 1
store i8 %68, i8* %66, align 1
%69 = load i8*, i8** %1, align 8
%70 = load i8, i8* %69, align 1
%71 = add i8 %70, 1
store i8 %71, i8* %69, align 1
%72 = load i8*, i8** %1, align 8
%73 = load i8, i8* %72, align 1
%74 = add i8 %73, 1
store i8 %74, i8* %72, align 1
%75 = load i8*, i8** %1, align 8
%76 = load i8, i8* %75, align 1
%77 = add i8 %76, 1
store i8 %77, i8* %75, align 1
%78 = load i8*, i8** %1, align 8
%79 = load i8, i8* %78, align 1
%80 = add i8 %79, 1
store i8 %80, i8* %78, align 1
%81 = load i8*, i8** %1, align 8
%82 = load i8, i8* %81, align 1
%83 = add i8 %82, 1
store i8 %83, i8* %81, align 1
%84 = load i8*, i8** %1, align 8
%85 = load i8, i8* %84, align 1
%86 = add i8 %85, 1
store i8 %86, i8* %84, align 1
%87 = load i8*, i8** %1, align 8
%88 = load i8, i8* %87, align 1
%89 = add i8 %88, 1
store i8 %89, i8* %87, align 1
%90 = load i8*, i8** %1, align 8
%91 = load i8, i8* %90, align 1
%92 = add i8 %91, 1
store i8 %92, i8* %90, align 1
%93 = load i8*, i8** %1, align 8
%94 = load i8, i8* %93, align 1
%95 = add i8 %94, 1
store i8 %95, i8* %93, align 1
%96 = load i8*, i8** %1, align 8
%97 = load i8, i8* %96, align 1
%98 = add i8 %97, 1
store i8 %98, i8* %96, align 1
%99 = load i8*, i8** %1, align 8
%100 = load i8, i8* %99, align 1
%101 = add i8 %100, 1
store i8 %101, i8* %99, align 1
%102 = load i8*, i8** %1, align 8
%103 = load i8, i8* %102, align 1
%104 = add i8 %103, 1
store i8 %104, i8* %102, align 1
%105 = load i8*, i8** %1, align 8
%106 = load i8, i8* %105, align 1
%107 = add i8 %106, 1
store i8 %107, i8* %105, align 1
%108 = load i8*, i8** %1, align 8
%109 = load i8, i8* %108, align 1
%110 = add i8 %109, 1
store i8 %110, i8* %108, align 1
%111 = load i8*, i8** %1, align 8
%112 = load i8, i8* %111, align 1
%113 = add i8 %112, 1
store i8 %113, i8* %111, align 1
%114 = load i8*, i8** %1, align 8
%115 = load i8, i8* %114, align 1
%116 = add i8 %115, 1
store i8 %116, i8* %114, align 1
%117 = load i8*, i8** %1, align 8
%118 = load i8, i8* %117, align 1
%119 = add i8 %118, 1
store i8 %119, i8* %117, align 1
%120 = load i8*, i8** %1, align 8
%121 = load i8, i8* %120, align 1
%122 = add i8 %121, 1
store i8 %122, i8* %120, align 1
%123 = load i8*, i8** %1, align 8
%124 = load i8, i8* %123, align 1
%125 = add i8 %124, 1
store i8 %125, i8* %123, align 1
%126 = load i8*, i8** %1, align 8
%127 = load i8, i8* %126, align 1
%128 = add i8 %127, 1
store i8 %128, i8* %126, align 1
%129 = load i8*, i8** %1, align 8
%130 = load i8, i8* %129, align 1
%131 = add i8 %130, 1
store i8 %131, i8* %129, align 1
%132 = load i8*, i8** %1, align 8
%133 = load i8, i8* %132, align 1
%134 = add i8 %133, 1
store i8 %134, i8* %132, align 1
%135 = load i8*, i8** %1, align 8
%136 = load i8, i8* %135, align 1
%137 = add i8 %136, 1
store i8 %137, i8* %135, align 1
%138 = load i8*, i8** %1, align 8
%139 = load i8, i8* %138, align 1
%140 = add i8 %139, 1
store i8 %140, i8* %138, align 1
%141 = load i8*, i8** %1, align 8
%142 = load i8, i8* %141, align 1
%143 = add i8 %142, 1
store i8 %143, i8* %141, align 1
%144 = load i8*, i8** %1, align 8
%145 = load i8, i8* %144, align 1
%146 = add i8 %145, 1
store i8 %146, i8* %144, align 1
%147 = load i8*, i8** %1, align 8
%148 = load i8, i8* %147, align 1
%149 = add i8 %148, 1
store i8 %149, i8* %147, align 1
%150 = load i8*, i8** %1, align 8
%151 = load i8, i8* %150, align 1
%152 = add i8 %151, 1
store i8 %152, i8* %150, align 1
%153 = load i8*, i8** %1, align 8
%154 = load i8, i8* %153, align 1
%155 = add i8 %154, 1
store i8 %155, i8* %153, align 1
%156 = load i8*, i8** %1, align 8
%157 = load i8, i8* %156, align 1
%158 = add i8 %157, 1
store i8 %158, i8* %156, align 1
%159 = load i8*, i8** %1, align 8
%160 = load i8, i8* %159, align 1
%161 = add i8 %160, 1
store i8 %161, i8* %159, align 1
%162 = load i8*, i8** %1, align 8
%163 = load i8, i8* %162, align 1
%164 = add i8 %163, 1
store i8 %164, i8* %162, align 1
%165 = load i8*, i8** %1, align 8
%166 = load i8, i8* %165, align 1
%167 = add i8 %166, 1
store i8 %167, i8* %165, align 1
%168 = load i8*, i8** %1, align 8
%169 = load i8, i8* %168, align 1
%170 = add i8 %169, 1
store i8 %170, i8* %168, align 1
%171 = load i8*, i8** %1, align 8
%172 = load i8, i8* %171, align 1
%173 = add i8 %172, 1
store i8 %173, i8* %171, align 1
%174 = load i8*, i8** %1, align 8
%175 = load i8, i8* %174, align 1
%176 = add i8 %175, 1
store i8 %176, i8* %174, align 1
%177 = load i8*, i8** %1, align 8
%178 = load i8, i8* %177, align 1
%179 = add i8 %178, 1
store i8 %179, i8* %177, align 1
%180 = load i8*, i8** %1, align 8
%181 = load i8, i8* %180, align 1
%182 = add i8 %181, 1
store i8 %182, i8* %180, align 1
%183 = load i8*, i8** %1, align 8
%184 = load i8, i8* %183, align 1
%185 = add i8 %184, 1
store i8 %185, i8* %183, align 1
%186 = load i8*, i8** %1, align 8
%187 = load i8, i8* %186, align 1
%188 = add i8 %187, 1
store i8 %188, i8* %186, align 1
%189 = load i8*, i8** %1, align 8
%190 = load i8, i8* %189, align 1
%191 = add i8 %190, 1
store i8 %191, i8* %189, align 1
%192 = load i8*, i8** %1, align 8
%193 = load i8, i8* %192, align 1
%194 = add i8 %193, 1
store i8 %194, i8* %192, align 1
%195 = load i8*, i8** %1, align 8
%196 = load i8, i8* %195, align 1
%197 = add i8 %196, 1
store i8 %197, i8* %195, align 1
%198 = load i8*, i8** %1, align 8
%199 = load i8, i8* %198, align 1
%200 = sext i8 %199 to i32
%201 = call i32 @putchar(i32 %200)
%202 = load i8*, i8** %1, align 8
%203 = load i8, i8* %202, align 1
%204 = add i8 %203, 1
store i8 %204, i8* %202, align 1
%205 = load i8*, i8** %1, align 8
%206 = load i8, i8* %205, align 1
%207 = sext i8 %206 to i32
%208 = call i32 @putchar(i32 %207)
%209 = load i8*, i8** %1, align 8
%210 = load i8, i8* %209, align 1
%211 = add i8 %210, 1
store i8 %211, i8* %209, align 1
%212 = load i8*, i8** %1, align 8
%213 = load i8, i8* %212, align 1
%214 = sext i8 %213 to i32
%215 = call i32 @putchar(i32 %214)
%216 = load i8*, i8** %1, align 8
%217 = getelementptr inbounds i8, i8* %216, i32 1
store i8* %217, i8** %1, align 8
%218 = load i8*, i8** %1, align 8
%219 = load i8, i8* %218, align 1
%220 = add i8 %219, 1
store i8 %220, i8* %218, align 1
%221 = load i8*, i8** %1, align 8
%222 = load i8, i8* %221, align 1
%223 = add i8 %222, 1
store i8 %223, i8* %221, align 1
%224 = load i8*, i8** %1, align 8
%225 = load i8, i8* %224, align 1
%226 = add i8 %225, 1
store i8 %226, i8* %224, align 1
%227 = load i8*, i8** %1, align 8
%228 = load i8, i8* %227, align 1
%229 = add i8 %228, 1
store i8 %229, i8* %227, align 1
%230 = load i8*, i8** %1, align 8
%231 = load i8, i8* %230, align 1
%232 = add i8 %231, 1
store i8 %232, i8* %230, align 1
%233 = load i8*, i8** %1, align 8
%234 = load i8, i8* %233, align 1
%235 = add i8 %234, 1
store i8 %235, i8* %233, align 1
%236 = load i8*, i8** %1, align 8
%237 = load i8, i8* %236, align 1
%238 = add i8 %237, 1
store i8 %238, i8* %236, align 1
%239 = load i8*, i8** %1, align 8
%240 = load i8, i8* %239, align 1
%241 = add i8 %240, 1
store i8 %241, i8* %239, align 1
%242 = load i8*, i8** %1, align 8
%243 = load i8, i8* %242, align 1
%244 = add i8 %243, 1
store i8 %244, i8* %242, align 1
%245 = load i8*, i8** %1, align 8
%246 = load i8, i8* %245, align 1
%247 = add i8 %246, 1
store i8 %247, i8* %245, align 1
%248 = load i8*, i8** %1, align 8
%249 = load i8, i8* %248, align 1
%250 = sext i8 %249 to i32
%251 = call i32 @putchar(i32 %250)
ret i32 0
}
; Function Attrs: nounwind
declare noalias i8* @malloc(i64) #3
declare i32 @putchar(i32) #1
attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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"}
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="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" }
attributes #2 = { noreturn nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="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" }
attributes #3 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="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" }
attributes #4 = { noreturn nounwind }
attributes #5 = { nounwind}
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)"}
int main(){int a = 5;int b = 10;int c = a + b;return c + a;}
; ModuleID = 'first.c'
source_filename = "first.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i32, align 4
%4 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 5, i32* %2, align 4
store i32 10, i32* %3, align 4
%5 = load i32, i32* %2, align 4
%6 = load i32, i32* %3, align 4
%7 = add nsw i32 %5, %6
store i32 %7, i32* %4, align 4
%8 = load i32, i32* %4, align 4
%9 = load i32, i32* %2, align 4
%10 = add nsw i32 %8, %9
ret i32 %10
}
attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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, !"wchar_size", i32 4}
!1 = !{!"clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)"}

LLVM IRを読む

人よ、LLVM IRを読め。

ふとした事からLLVMに興味を持ち、LLVM IRをなんとなく読んでみたので、知見を記録しておく。

基礎

とりあえず生成して読んでみる。

int main(){
    int a = 5;
    int b = 10;
    int c = a + b;
    return c + a;
}

適当に簡単なコードを書いて

clang -S -emit-llvmでLLVM IRを吐いてもらう(拡張子は.ll)

すると

; ModuleID = 'first.c'
source_filename = "first.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

; Function Attrs: noinline nounwind optnone uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 5, i32* %2, align 4
  store i32 10, i32* %3, align 4
  %5 = load i32, i32* %2, align 4
  %6 = load i32, i32* %3, align 4
  %7 = add nsw i32 %5, %6
  store i32 %7, i32* %4, align 4
  %8 = load i32, i32* %4, align 4
  %9 = load i32, i32* %2, align 4
  %10 = add nsw i32 %8, %9
  ret i32 %10
}

attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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, !"wchar_size", i32 4}
!1 = !{!"clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)"}

こんな感じで生成された。

とりあえず本質的であろうFunctionを読んでみたい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment