рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдФрд░ рдЧреЛ

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░, рдЬреЛ LLVM IR рдЕрд╕реЗрдВрдмрд▓реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ LLVM рд╕рдВрдХрд▓рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЯреАрдПрд▓; рдбреАрдЖрд░ рд╣рдордиреЗ рд╢реБрджреНрдз рдЧреЛ рдкрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрд╛ рдерд╛, рдХреЛрдб рдХреЗ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ред

LLVM IR рдкрд░ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг


(рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЖрдк рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред

LLVM IR, рд▓реЛ-рд▓реЗрд╡рд▓ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬреЛ LLVM рд╕рдВрдХрд▓рди рдврд╛рдВрдЪреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреАрдп рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВред

рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рдХреЛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ (IR, рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡) рдореЗрдВ рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЬреИрд╕реЗ x86) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред

рд╕реНрдкреЙрдЗрд▓рд░
рд╕рдВрдХрд▓рдХ рдореЗрдВ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрд╛рдкрдХ рд╣реИред GCC GIMPLE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, Roslyn CIL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, LLVM LLVM IR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдХрдИ рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХреЗрдВ рдЖрдо рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ, рд╕реНрдерд┐рд░рд╛рдВрдХ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛), рдпреЗ рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕ рд╕реАрдзреЗ рдЖрдИрдЖрд░ рд╕реНрддрд░ рдкрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдкреЙрдЗрд▓рд░
рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛ (IR) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ n рд╕реНрд░реЛрдд рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдореА рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдмреИрдХреЗрдВрдб) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ n * m рд╕реЗ n + m рддрдХ рдХрдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рдлреНрд░рдВрдЯрдПрдВрдб, рдорд┐рдбрд▓реИрдВрдб рдФрд░ рдмреИрдХреЗрдВрдб, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ / рдпрд╛ рдЖрдИрдЖрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИред

  • рд╕реАрдорд╛: рдЖрдИрдЖрд░ рдореЗрдВ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • рдорд┐рдбрд┐рд▓рд▓реИрдВрдб: рдЖрдИрдЖрд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ
  • рдмреИрдХрдПрдВрдб: рдЖрдИрдЖрд░ рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ



LLVM IR рдХреЛрдбрд╛рдВрддрд░рдХ рдирдореВрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо


рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

int f(int a, int b) { return a + 2*b; } int main() { return f(10, 20); } 

рд╣рдо Clang рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрд░реЛрдХреНрдд C рдХреЛрдб рдХреЛ LLVM IR рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдмрдЬрдирд╛
clang -S -emit-llvm -o foo.ll foo.c.

 define i32 @f(i32 %a, i32 %b) { ; <label>:0 %1 = mul i32 2, %b %2 = add i32 %a, %1 ret i32 %2 } define i32 @main() { ; <label>:0 %1 = call i32 @f(i32 10, i32 20) ret i32 %1 } 

рдЙрдкрд░реЛрдХреНрдд LLVM IR рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдХреБрдЫ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп LLVM IR рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:

LLVM IR рд╕реНрдЯреЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ i32 рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ (рдпрд╛рдиреА, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ% 1 @f рдореЗрдВ% 1 рд╕реЗ рдЕрд▓рдЧ рд╣реИ)ред

(рдЕрд╕реНрдерд╛рдпреА рд░рдЬрд┐рд╕реНрдЯрд░) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,% 1,% 2), рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдПрдХ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ (32 рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЬреИрд╕реЗ @f) рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЬреИрд╕реЗ% a,% 1) рдПрдХ рдЙрдкрд╕рд░реНрдЧ (@ рдФрд░%, рдХреНрд░рдорд╢рдГ) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИрдВред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдорд╛рдВрдб рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрд▓ рдЧреБрдгрд╛, рдЬреЛрдбрд╝, рдЬреЛрдбрд╝ рдЖрджрд┐ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рдерд╛рдЧрдд рд╣реИ;

LLMV IR рдЕрд╕реЗрдВрдмрд▓рд░ рд╕рдВрд░рдЪрдирд╛


LLVM IR рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдШреЛрд╖рдгрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рдиред

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдореЗрдВ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА)ред

LLVM IR рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ @foo рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ @f рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд┐рд╕рдореЗрдВ рддреАрди рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХ (% рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐,% block_1 рдФрд░% block_2) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

 ;  ,  32-  21 @foo = global i32 21 ; f  42,   cond ,  0    define i32 @f(i1 %cond) { ;       ,     ;      entry: ;     br    block_1,  %cond ; ,   block_2   . br i1 %cond, label %block_1, label %block_2 ;     ,    ,     block_1: %tmp = load i32, i32* @foo %result = mul i32 %tmp, 2 ret i32 %result ;     ,     ,     block_2: ret i32 0 } 

рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ


рдПрдХ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдЙрди рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ рдЬреЛ рд╕рдВрдХреНрд░рдордг рдЖрджреЗрд╢ (рд╕рдорд╛рдкреНрддрд┐ рдЖрджреЗрд╢) рдирд╣реАрдВ рд╣реИрдВред рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмреЗрд╕ рдпреВрдирд┐рдЯ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рдЯреАрдо


рдПрдХ рдХрдорд╛рдВрдб рдЬреЛ рдХрд┐ рдЬрдВрдк рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдЧрдгрдирд╛ рдпрд╛ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрдб, рд▓реЛрдб) рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдЯрд░реНрдорд┐рдиреЗрд╢рди рдЯреАрдо


рд╕рдорд╛рдкреНрддрд┐ рдЖрджреЗрд╢ рдкреНрд░рддреНрдпреЗрдХ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдВрдЧ рд░рд┐рдЯ рдХрдорд╛рдВрдб рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ br рд╕рдВрдХреНрд░рдордг, рд╕рд╢рд░реНрдд рдпрд╛ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдПрд╕рдПрд╕рдП рдлреЙрд░реНрдо


рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрд╕рдПрд╕рдП рдлреЙрд░реНрдо (рд╕реНрдЯреЗрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЧреБрдг рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рдореВрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LLVM IR рдореЗрдВ phi рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Phi рдХрдорд╛рдВрдб рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдПрдХ рдПрдХрд▓ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрдорд╛рдВрдб рдЗрд╕ рдХрдорд╛рдВрдб рддрдХ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдорд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЗрдирдкреБрдЯ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 define i32 @f(i32 %a) { ; <label>:0 switch i32 %a, label %default [ i32 42, label %case1 ] case1: %x.1 = mul i32 %a, 2 br label %ret default: %x.2 = mul i32 %a, 3 br label %ret ret: %x.0 = phi i32 [ %x.2, %default ], [ %x.1, %case1 ] ret i32 %x.0 } 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ phi рдХрдорд╛рдВрдб (рдЬрд┐рд╕реЗ рдХрднреА-рдХрднреА рдлреА рдиреЛрдб рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╕рдВрднрд╡ рдЗрдирдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрде рдХреЗ рд▓рд┐рдП, рдЪрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрдереЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрдм рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ LLVM IR рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕реНрдерд╛рдиреАрдп рд╕реНрд░реЛрдд рдХреЛрдб рдЪрд░ рдХреЛ SSA рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╛ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдкрддрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрд▓рдПрд▓рд╡реАрдПрдо рдлреНрд░рдВрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛ рдХреЛ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рдореЗрдВ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдЪрд░ (рдПрд▓реЛрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП), рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯреНрд╕ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдореЗрдореЛрд░реА рд╕реЗ рдкрдврд╝реЗ рдЧрдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдП рдХреЗ рд░реВрдк рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рдХрд╛ рд╕реАрдзреЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ nontrivial рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рддрдХ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреБрдЫ рдкреИрдЯрд░реНрдиреЛрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИ, рд╣рдо рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдерд╛рдиреАрдп рдЪрд░реЛрдВ рдХреЛ SSA рдлреЙрд░реНрдо рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LL2M рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдо 2 рдЧреНрд░рд╛рдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдкрд╛рд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╡рд╣рд╛рдВ рдлреА рдиреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

рд╢реБрджреНрдз рдЧреЛ рдкрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА


рдЧреЛ рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ:

https://godoc.org/llvm.org/llvm/bindings/go/llvm : рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ LLVM рдмрд╛рдЗрдВрдбрд┐рдВрдЧред
github.com/llir/llvm : LLVM IR рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдЧреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред

рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдореГрджреНрдз рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрд▓рдУрдЖрдИрдЖрд░ / рдПрд▓рдПрд▓рд╡реАрдПрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреЛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд▓реЗрдЦ llir / llvm рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдирдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ?


рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдЧреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рд▓реЗрдЦрди рд╕рдВрдХрд▓рдХ рдФрд░ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдмрдирд╛рдирд╛ рдерд╛, рдЬреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд╕рдВрдХрд▓рди рдврд╛рдВрдЪреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдПрдХ рдЕрдзрд┐рдХ рдордЬреЗрджрд╛рд░ рдХрд╛рд░реНрдпред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдерд╛ рдХрд┐ рдЧреЛ рдХреЗ рд╕рд╛рде рдЖрдзрд┐рдХрд╛рд░рд┐рдХ LLVM рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (TinyGo рдХреЗ рд▓реЗрдЦрдХ @aykevl рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдм рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ LLVM 4 рдХреЗ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

рд╕реНрдкреЙрдЗрд▓рд░
Github.com/aykevl/go-llvm рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд LLVM рдХреЗ рд▓рд┐рдП рдЧреЛ рдмрд╛рдЗрдВрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдмрдбрд╝реА рдкреНрд░реЗрд░рдгрд╛ рдЧреЛ рдПрдкреАрдЖрдИ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдерд╛ред рдЧреЛ рдФрд░ llir / llvm рдХреЗ рд▓рд┐рдП LLVM рдмрд╛рдЗрдВрдбрд┐рдВрдЧ API рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ LLVM рдорд╛рди рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрд╛рдЗрдВрдбрд░реНрд╕ рдореЗрдВ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рдареЛрд╕ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╡ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдмрд╕реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдУрдкрдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рдирдСрдкрдХреЛрдб рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╣рдЬ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Opcode рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ opcode рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА: "рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХрд╛" рдХрд╛рд╕реНрдЯ () рддрд░реНрдХ! " (рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг)ред

Llir / llvm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ Go рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдПрд▓рдПрд▓рд╡реА / рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рднреА рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдЙрдкрд▓рдмреНрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЕрдм рдЖрдЗрдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ LLVM IR рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдЕрдиреНрдп рдЙрдкрдХрд░рдг, рдЬреИрд╕реЗ рдХреНрд▓реИрдВрдЧ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ LLVM рдСрдкреНрдЯ (рдиреАрдЪреЗ рдирдореВрдирд╛ рдЗрдирдкреБрдЯ рджреЗрдЦреЗрдВ) рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди LLVM IR рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд╕рд░реЗ, рд╣рдо рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдЕрдкрдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛, рдпрд╛ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред

рддреАрд╕рд░рд╛, рд╣рдо рдПрдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╣рдо рдПрдХ рдирдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдиреАрдЪреЗ рдирдореВрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рджреЗрдЦреЗрдВ)ред

рдирдореВрдирд╛ рдЗрдирдкреБрдЯ рдХреЛрдб - рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ

 //       LLVM IR,    //     package main import ( "fmt" "github.com/llir/llvm/asm" ) func main() { //    LLVM IR. m, err := asm.ParseFile("foo.ll") if err != nil { panic(err) } // ,    LLVM IR. // Print LLVM IR module. fmt.Println(m) } 

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрджрд╛рд╣рд░рдг - рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░

 //      LLVM IR     //  Graphviz DOT package main import ( "bytes" "fmt" "io/ioutil" "github.com/llir/llvm/asm" "github.com/llir/llvm/ir" ) func main() { //    LLVM IR. m, err := asm.ParseFile("foo.ll") if err != nil { panic(err) } //    . callgraph := genCallgraph(m) //      Graphviz DOT. if err := ioutil.WriteFile("callgraph.dot", callgraph, 0644); err != nil { panic(err) } } // genCallgraph      Graphviz DOT    LLVM IR func genCallgraph(m *ir.Module) []byte { buf := &bytes.Buffer{} buf.WriteString("digraph {\n") //      for _, f := range m.Funcs { //   caller := f.Ident() fmt.Fprintf(buf, "\t%q\n", caller) //       for _, block := range f.Blocks { //   ,       . for _, inst := range block.Insts { //  .   call. switch inst := inst.(type) { case *ir.InstCall: callee := inst.Callee.Ident() //        . fmt.Fprintf(buf, "\t%q -> %q\n", caller, callee) } } //     switch term := block.Term.(type) { case *ir.TermRet: //  - _ = term } } } buf.WriteString("}") return buf.Bytes() } 

рдирдореВрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб - рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЬреЗрдирд░реЗрд╢рди

 //     LLVM IR,    C, //    . // // int abs(int x); // // int seed = 0; // // // ref: https://en.wikipedia.org/wiki/Linear_congruential_generator // // a = 0x15A4E35 // // c = 1 // int rand(void) { // seed = seed*0x15A4E35 + 1; // return abs(seed); // } package main import ( "fmt" "github.com/llir/llvm/ir" "github.com/llir/llvm/ir/constant" "github.com/llir/llvm/ir/types" ) func main() { //      i32 := types.I32 zero := constant.NewInt(i32, 0) a := constant.NewInt(i32, 0x15A4E35) //  PRNG. c := constant.NewInt(i32, 1) //  PRNG. //    LLVM IR. m := ir.NewModule() //         . // // int abs(int x); abs := m.NewFunc("abs", i32, ir.NewParam("x", i32)) //         . // // int seed = 0; seed := m.NewGlobalDef("seed", zero) //        . // // int rand(void) { ... } rand := m.NewFunc("rand", i32) //           `rand`. entry := rand.NewBlock("") //         . tmp1 := entry.NewLoad(seed) tmp2 := entry.NewMul(tmp1, a) tmp3 := entry.NewAdd(tmp2, c) entry.NewStore(tmp3, seed) tmp4 := entry.NewCall(abs, tmp3) entry.NewRet(tmp4) //   LLVM IR  . fmt.Println(m) } 

рдирд┐рд╖реНрдХрд░реНрд╖


Llir / llvm рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рди рдХреЗрд╡рд▓ рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛, рдмрд▓реНрдХрд┐ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХрд┐рдпрд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рдбрд┐рдмрдЧ рдХрд┐рдпрд╛, рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдФрд░ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрддреНрд╕реБрдХрддрд╛ рджрд┐рдЦрд╛рдИред

Llir / llvm рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ LLVM IR рдХреЗ рд▓рд┐рдП рдПрдХ EBNF рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ LLVM 7.0 рддрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдкреВрд░реНрдг LLVM IR рднрд╛рд╖рд╛ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХрдард┐рдирд╛рдИ рд╕реНрд╡рдпрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдореЗрдВ рдХрд┐ рдкреВрд░реА рднрд╛рд╖рд╛ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд╕рдореБрджрд╛рдпреЛрдВ рдиреЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд▓рд┐рдП рдФрдкрдЪрд╛рд░рд┐рдХ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рднрд╛рд╖рд╛ рдХрд╛ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗрдЯ рд╣реИред

рд╡реНрдпрд╛рдХрд░рдг LLVM IR рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреА рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧреЛрд╕реНрдорд┐рде рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдХреНрд░реЙрд╕-рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рднрд╡рд┐рд╖реНрдп рдЕрджреНрднреБрдд рд╣реИ, рдЦреБрд╢ рд╣реИрдХрд┐рдВрдЧ!

рд╕рдВрджрд░реНрдн


1. рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдЕрдзреНрдпрд╛рдп , рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓реЗрдЦрдХ, "рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдСрдл рдУрдкрди рд╕реЛрд░реНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдкреБрд╕реНрддрдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

2. рдПрд▓рдПрд▓рд╡реАрдПрдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рдХреИрд▓реАрдбреЛрд╕реНрдХреЛрдк рднрд╛рд╖рд╛ рдЧрд╛рдЗрдб рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдПрдХ рджреГрд╢реНрдп рдХреЗ рд▓реЗрдЦрди рдХреЗ рд╕рднреА рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ, рдПрдХ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рд╢рд╛рдорд┐рд▓ рд╣реИред

3. рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рднрд╛рд╖рд╛ рд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдкреБрд╕реНрддрдХ " рдореИрдкрд┐рдВрдЧ рд╣рд╛рдИ рд▓реЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯреНрд╕ рдЯреВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ " рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред

рд╕реНрд▓рд╛рдЗрдб рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реЗрдЯ рдПрд▓рдПрд▓рд╡реАрдПрдо рд╣реИ, рдЧреНрд░реЗрдЯ рдбрд┐рдЯреЗрд▓ рдореЗрдВ , рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реА ++ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрдиреБрдХреВрд▓рди рдорд╛рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рд╡реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕реНрдерд┐рд░ред

рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬреЛрдбрд╝ рдЧреЛ рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рд╣реИред

Source: https://habr.com/ru/post/hi459704/


All Articles