рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрдВрджрд░ рд╕реЗ: рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдореИрдВ habrayuzer рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо LLVM рд╕рдВрдХрд▓рдХ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЖрдк LLVM рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣рд╛рдБ рдпрд╛ llvm.org рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрд▓рдПрд▓рд╡реАрдПрдо (рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ) рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ - рдмрд╛рдпрдЯреЗрдХреЛрдб, рд╕рдВрдХрд▓рди рд░рдгрдиреАрддрд┐ рдФрд░ рдЙрд░реНрдл тАЛтАЛрдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рддрд╛рд╡рд░рдгред рдореИрдВ рдмрд╛рдж рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред



рд╕рд╛рдордЧреНрд░реА:
рдпрд╣ рдЖрд▓реЗрдЦ GNV / Linux (Ubuntu 10.04) рдХреЗ рддрд╣рдд LLVM 2.7+ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ ред рд╕рд╛рдордЧреНрд░реА рдЖрдИрдПрд╕рдкреА рдЖрд░рдПрдПрд╕ рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рдПрдХ рд╡рд░реНрд╖ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред



рдПрд▓рдПрд▓рд╡реАрдПрдо рд╡рд┐рдзрд╛рдирд╕рднрд╛


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

mkdir build && cd build



# рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

.. / рд╡рд┐рдиреНрдпрд╕реНрдд рдХрд░реЗрдВ --enable-jit --enable -рдЕрдиреБрдХреВрд▓рд┐рдд -рд╕рд╛рдЭрд╛-рд╕рд╛рдЭрд╛- рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ = / рдЙрдкрд╕рд░реНрдЧ - рдкреНрд░рд╛рдкреНрдп -рд▓рдХреНрд╖реНрдп = host-only



# - рд╕рд╛рдЭрд╛-рд╕рд╛рдЭрд╛ рдЖрдкрдХреЛ LLVM рдХрд░реНрдиреЗрд▓ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рд╕рд╛рдЭрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

# рдХреЗ рдмрдЬрд╛рдп / рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрде рд╕реЗрдЯ рдХрд░реЗрдВ

# - рдпреЛрдЧреНрдп-рд▓рдХреНрд╖реНрдп = рд╣реЛрд╕реНрдЯ-рдХреЗрд╡рд▓ рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕рдорд░реНрдерди рд╣реИ

# рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп-рдЕрднрд┐рдХрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╣рд░ рдХрджрдо рдкрд░ рдХреЛрдб рдореЗрдВ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЪрдХреНрд░реЛрдВ рдореЗрдВ



# рд╡рд┐рдзрд╛рдирд╕рднрд╛

make -j2 CXXFLAGS = -O3

# -рдЬреЗрдПрди рдмрд╣реБрдд рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп, рд╕рднреА рдПрдХ рд╣реА, рд╕рдм рдХреБрдЫ рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛,

# рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

# CXXFLAGS = -O3 рдЕрддрд┐рд░рд┐рдХреНрдд GCC рдЕрдиреБрдХреВрд▓рди рджреЗрддрд╛ рд╣реИред

# рдЖрдк рдЬреАрд╕реАрд╕реА 4.5+ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -flto рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ



# рд╕реНрдерд╛рдкрдирд╛

рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЕрдм llvm-gcc рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

# рдХреЛрдб рд▓реЗ рд▓реЛ

svn co http: // llvm.org / svn / llvm-project / llvm-gcc- 4.2 / рдЯреНрд░рдВрдХ llvm-gcc



cd llvm-gcc && mkdir build && cd build



# рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

.. / рд╡рд┐рдиреНрдпрд╕реНрдд рдХрд░реЗрдВ --enable-llvm = / path / to / llvm / build --prefix = / prefix / of / llvm --program-prefix = llvm- --enable-languages = c, c ++

# / рдкрде / to / llvm / build рдХрд╛ рдЕрд░реНрде рд╣реИ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдЙрд╕реА рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде

# # рдЙрдкрд╕рд░реНрдЧ / / llvm - рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЙрдкрд╕рд░реНрдЧ LLVM рдЙрдкрд╕рд░реНрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ

# --рдкреНрд░реЛрдЧреНрд░рд╛рдо-рдЙрдкрд╕рд░реНрдЧ = llvm- рдХреЛ llvm-gcc рдпрд╛ llvm-g ++ рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ



# рд╡рд┐рдзрд╛рдирд╕рднрд╛

make -j2 CFLAGS = -O3



# рд╕реНрдерд╛рдкрдирд╛

рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдЪреЗрдХ рдкрд╛рд╕ рд╣реЛрдЧрд╛:

/ рдЙрдкрд╕рд░реНрдЧ / рдХрд╛ / llvm / llvm-gcc -v

...

gcc рд╕рдВрд╕реНрдХрд░рдг 4.2.1 ( Apple Inc. build 5658 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ ) ( LLVM build )


рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рд╕реНрдиреИрдк


рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЧреНрд░рд╣рдг рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╕рдВрдХрд▓рди рдФрд░ рдЕрдзреНрдпрдпрди рдХреИрд╕реЗ рдХрд░реЗрдВ (рдмреЗрд╢рдХ, рд╕реА / рд╕реА ++ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде)ред рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ C ++ / File-New - C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ, рдирд╛рдо "llvm" / рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рд╕реЗрдЯ рдХрд░реЗрдВ , рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд╛рди рдЕрдирдЪреЗрдХ рдХрд░реЗрдВ / рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ / рдФрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реНрд░реЛрдд рдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдкрде рд╕реЗрдЯ рдХрд░реЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ Makefile / Project рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ : рдореЗрдХрдлрд╛рдЗрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ - рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ / ред рдЕрдЧрд▓рд╛, "рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ" / рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред рдЬрдмрдХрд┐ рдЧреНрд░рд╣рдг рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ / рдкреНрд░реЛрдЬреЗрдХреНрдЯ - рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ / рдкрд░ рдЬрд╛рдПрдВ ред рдмрд┐рд▓реНрдбрд░ / рдмрд┐рд▓реНрдбрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрд┐рд▓реНрдб рдХрдорд╛рдВрдб рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░реЗрдВ / рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрд┐рд▓реНрдб рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ / рдФрд░ "рдореЗрдХ -j2 CXXFLAGS = -O3" рджрд░реНрдЬ рдХрд░реЗрдВред рдмрд┐рд▓реНрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА / рдмрд┐рд▓реНрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА / рдореЗрдВ, "/ рдмрд┐рд▓реНрдб" рдЬреЛрдбрд╝реЗрдВ, рддрд╛рдХрд┐ рдпрд╣ "$ {рд╡рд░реНрдХрд╕реНрдкреЗрд╕_рд▓реЛрдХ: / llvm} / рдмрд┐рд▓реНрдб" рд╣реЛред рд╡реНрдпрд╡рд╣рд╛рд░ рдЯреИрдм / рд╡реНрдпрд╡рд╣рд╛рд░ / рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдмрд┐рд▓реНрдб рд▓рдХреНрд╖реНрдп / рдмрд┐рд▓реНрдб (рдЗрдВрдХреНрд░реАрдореЗрдВрдЯрд▓ рдмрд┐рд▓реНрдб) рдХреЗ рджрд╛рдИрдВ рдУрд░ / "рд╕рднреА" рдорд┐рдЯрд╛ рджреЗрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдореИрдиреБрдЕрд▓ рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣реЛ рдЧрдпрд╛! рдЖрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреВрдж рд╕рдХрддреЗ рд╣реИрдВ, # рджреЗрдЦреЗрдВ рдФрд░ рдмрд┐рд▓реНрдб рдмрдЯрди / рдмрд┐рд▓реНрдб / рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ (рдЬреИрд╕реЗ рдХреЛрдИ) рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреЗрдбрд╝ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред



рдкрд░реНрдпрд╛рд╡рд░рдг рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


LLVM рдореЗрдВ libLLVM2.x.so (рдХрд░реНрдиреЗрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдирд┐рд╖реНрдкрд╛рджрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдСрдкреНрдЯ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдмрд╛рдЗрдЯрдХреЛрдб рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдпрд╣ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдорд╢реАрди-рд╕реНрд╡рддрдВрддреНрд░ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд░реЛрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░ O0, O1, O2 рдФрд░ O3 рд╣реИрдВред

llc - рдЯрд╛рд░рдЧреЗрдЯ рдорд╢реАрди рдХреЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ bytecode рдХреЛрдб рдЬрдирд░реЗрдЯрд░ред рдорд╢реАрди рдЖрд╢реНрд░рд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░ O0, O1, O2 рдФрд░ O3 рднреА рд╣реИрдВред

llvm-ld - рдмрд╛рдИрдЯреЗрдХреЛрдб рд▓рд┐рдВрдХрд░, рдЕрд░реНрдерд╛рдд рдЙрдкрдХрд░рдг рдПрдХ рдмрдбрд╝реА рдИ.рдкреВ. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдИ рдмрд╛рдЗрдЯрдХреЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд░реЛрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╣реБрдд рдЧрд░реНрд╡ рд╣реИред

LIT JIT рд╕рдВрдХрд▓рди рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рдИрдЯреЗрдХреЛрдб рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИред

llvm-dis - bytecode (bc) рд╕рдордХрдХреНрд╖ рдкрд╛рда рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ (ll) рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд▓рд┐рдПред

llvm-as рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди (ll) рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб (bc) рдХрдирд╡рд░реНрдЯрд░ рд╣реИред

llvm-ar - рдПрдХ рдореЗрдВ рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреИрдХрд░ред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ bzip2 рдПрдирд╛рд▓реЙрдЧред

llvmc LLVM рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ, рдЬреЛ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдкрд╛рд░реНрд╕рд░ (рдпрд╛рдиреА рдлреНрд░рдВрдЯ-рдПрдВрдб: llvm-gcc рдпрд╛ clang) рдХрд╣рддрд╛ рд╣реИ, рдСрдкреНрдЯ, llc (рд▓рдХреНрд╖реНрдп рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреИрдХ-рдПрдВрдб), рдЕрд╕реЗрдВрдмрд▓рд░ рдФрд░ рд▓рдХреНрд╖реНрдп рдорд╢реАрди рдХреЗ рд▓рд┐рдВрдХрд░ред рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдХреЛ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред







рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рд╕рд┐рджреНрдз рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (x86, x86-64, ARM рд╕рд╣рд┐рдд) рдмреИрдХ-рдПрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реА рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рджреЗрд╢реАред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рд╕реАрдзреЗ рд╕реА рдореЗрдВ рд╕реНрд░реЛрдд рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдирд╛рдореЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ (рдпрд╛ рдмрд▓реНрдХрд┐, рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕реМрдВрдкреЗ рдЧрдП рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде), рдЧреЛрдЯреЛ рд▓реВрдкреНрд╕, рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдПрдХ рдмрджрд▓рд╛ рд╣реБрдЖ рдХреНрд░рдо, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдФрд░ рдХреИрд╕реЗ, рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗред рд╡реИрд╕реЗ, рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рд╕рдВрднрд╡рддрдГ рдЬрд╛рд╡рд╛ рдпрд╛ .NET рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



"рд▓реЛрд╣рд╛" рдмреИрдХ-рдПрдВрдб-рдПрд╕ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред LLVM рдмрд┐рд▓реНрдб рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ, рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЬрд┐рд╕реЗ tblgen рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ ред рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдгрдирд╛рддреНрдордХ рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рд╡рд┐рд╡рд░рдг рдХреЛ C ++ рдХреЛрдб рдореЗрдВ рднреА рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ #included рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдирд╛ рдпрд╛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рд╕рдорд░реНрдерди рдПрдХреАрдХреГрдд рд╣реИред рдЬреАрд╕реАрд╕реА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрдХреЛ рдХреНрд░реЙрд╕-рд╕рдВрдХрд▓рди рдкрд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдирд╣реАрдВ рдХрд░рдиреА рд╣реЛрдЧреА: рдЬрдм рдЖрдк llc рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ -рдЖрд░реНрдо = armv7, рдЬрд╣рд╛рдВ armv7 рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреЛрдИ рднреА рд╕рдорд░реНрдерд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдБ рдкрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдФрд░ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдХрд╣рддреЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛: рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрд╛рдпрдЯреЗрдХреЛрдб рдЖрдо рддреМрд░ рдкрд░ рдЙрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ рдорд╢реАрди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдУрдПрд╕-рдЖрд╢реНрд░рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рджреВрд╕рд░рд╛ рдХреЛрдбрдХ рдЖрд╡реЗрд╖рдг рдФрд░ рдХреЛрдб рдХреЗ рдкреЛрд░реНрдЯрд┐рдВрдЧ (рд╕рд╢рд░реНрдд рд╕рдВрдХрд▓рди) рдХреЗ рдХрд╛рд░рдг рд╡рд┐рднрд┐рдиреНрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╣реИред



рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХрд╛ рдорд╛рди:

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдирд╛рдореЛрдВ рд╕реЗ рдЕрд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдмреВрдд рднреНрд░рд╛рдордХ рдирд╣реАрдВ рд╣реИред



рдПрд▓рдПрд▓рд╡реАрдПрдо рдПрдкреАрдЖрдИ


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



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрдЬрд╛рдп рдкрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИред рдПрдХ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрдХреВрд▓рди рдпрд╛ рдЙрд╕рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдПрдХ рдкрд╛рд╕рдореИрди рд╣реИ, рдЬреЛ рдПрдлрдЖрдИрдПрдлрдУ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рдкрд╛рд╕ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рдмрдВрдзрдХ рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдорд╛рд░реНрдЧ рдХреЛ рдХреБрдЫ рд╕реАрдПрдлрдЬреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдкреНрд░рдмрдВрдзрдХ рдкрд╣рд▓реЗ рдЗрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЙрд╕рдХрд╛ рдбреЗрдЯрд╛ рдкреБрд░рд╛рдирд╛ рд╣реЛред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди (FunctionPass рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА) рдпрд╛ рдмреЗрд╕ рдмреНрд▓реЙрдХ (BasicBlockPass) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░реЗ рдореЗрдВ, рдЖрдзрд╛рд░ рдЗрдХрд╛рдИред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмреЗрд╕ рдмреНрд▓реЙрдХ рдкрд░ рдХреНрд░рдорд╢рдГ рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХ рдкрд░ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рд╕рдм рдХреБрдЫ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдирдП рддрддреНрд╡ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



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



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



рдЕрдиреБрдХреВрд▓рди рд╣реИрд▓реЛ, рд╡рд┐рд╢реНрд╡!


рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╢реАрди-рд╕реНрд╡рддрдВрддреНрд░ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд░реНрдЬрд┐рдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рдХрд░реЗрдЧреА рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдФрд╕рдд рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рддреА рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдСрдкреНрдЯ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ LLVM рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реНрд░реЛрдд рдкреЗрдбрд╝ рдХреА рдЬрдбрд╝ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдФрд░ рдЗрд╕рдореЗрдВ рдлрд╛рдЗрд▓ BasicBlockStats.cpp рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

#define DEBUG_TYPE "рдореВрд▓-рдмреНрд▓реЙрдХ-рдЖрдБрдХрдбрд╝реЗ"

# рдЬрд╛рд░реА рдХрд░реЗрдВ "llvm / Pass.h"

# рдЬрд╛рд░реА "llvm / Function.h"

# рдЬрд╛рд░реА рдХрд░реЗрдВ "llvm / рдирд┐рд░реНрджреЗрд╢.рдПрдЪ"

# рдЬрд╛рд░реА рдХрд░реЗрдВ "llvm / BasicBlock.h"

#include "llvm / ADT / Statistic.h"

#include "llvm / Transforms / Scalar.h"

#include "llvm / Support / CFG.h"



рдирд╛рдорд╕реНрдерд╛рди llvm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ;



// рдПрдХрддреНрд░рд┐рдд рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ред

// рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗрд╡рд▓ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



// рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛

рд╕рд╛рдВрдЦреНрдпрд┐рдХреА ( NumberOfBasicBlocks, "рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛" ) ;



// рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛

рд╕рд╛рдВрдЦреНрдпрд┐рдХреА ( NumberOfInstructions, "рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛" ) ;



// рдкреНрд░рддрд┐ рдмреЗрд╕ рдпреВрдирд┐рдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдФрд╕рдд рд╕рдВрдЦреНрдпрд╛

рд╕рд╛рдВрдЦреНрдпрд┐рдХреА ( рдФрд╕рдд рдЕрд╡рд░реЛрдзрди InBasicBlock, "рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдФрд╕рдд рд╕рдВрдЦреНрдпрд╛" ) ;



рдирд╛рдо рд╕реНрдерд╛рди

{



// рдкрд╛рд╕ (рдкрд╛рд╕) рдХреА рд╕рдВрд░рдЪрдирд╛ (рдХрдХреНрд╖рд╛)

// рдЖрдорддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ, рдЕрдиреБрдХреВрд▓рди рдХреЛ рдкрд╛рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐

// рдореЙрдбреНрдпреВрд▓ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреВрд░реНрдг рдкрд╛рд╕ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ

рдмреБрдирд┐рдпрд╛рджреА BasicBlockStats : рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣

{

// рдкрд╛рд╕ рдкрд╣рдЪрд╛рди рд╕рдВрдЦреНрдпрд╛

рд╕реНрдерд┐рд░ рдЪрд╛рд░ рдЖрдИрдбреА ;



BasicBlockStats ( ) : FunctionPass ( ID ) { }



// рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдЬреЛ рдкрд╛рд╕ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рджрд┐рдП рдЧрдП рдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрджрд▓рддрд╛ рд╣реИ

рд╡рд░реНрдЪреБрдЕрд▓ рд╢реВрдиреНрдп getAnalysisUsage ( AnalysisUsage рдФрд░ AU ) рдХрд╛рд╕реНрдЯ

{

// рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдХреБрдЫ рднреА рди рдмрджрд▓реЗрдВ

рдП.рдпреВ.ред setPreservesAll ( ) ;

}



// рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдЬреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкрд╛рд╕ - рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрд░реНрде рд╡рд╣рди рдХрд░рддреА рд╣реИ

рд╡рд░реНрдЪреБрдЕрд▓ рдмреВрд▓ runOnFunction ( рдлрд╝рдВрдХреНрд╢рди & рдПрдл ) ;



~ рдмреЗрд╕рд┐рдХрдмреНрд▓реЙрдХрд╕реНрдЯреИрдЯреНрд╕ ( )

{

// рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╕рдордп, рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

рдФрд╕рддрдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рдирдЗрдиреН рдмреЗрд╕рдмрд┐рдХрдмреНрд▓реЙрдХ = рдирдВрдмрд░рдСрдлрдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди / рдирдВрдмрд░рдСрдлрдмреЗрд╕рд┐рдХрдмреНрд▓реЙрдХ ;

}

} ;



// рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

char BasicBlockStats :: ID = 0 ;



// рдкрд╛рд╕ рдореИрдиреЗрдЬрд░ рдореЗрдВ рдкреИрд╕реЗрдЬ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ

RegisterPass < BasicBlockStats > X ( "рдмреЗрд╕рд┐рдХ-рдмреНрд▓реЙрдХ- рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХреНрд╕" , "рдмреЗрд╕рд┐рдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХреНрд╕" , рд╕рдЪ ) ;



} // рдЕрдирд╛рдо рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдЕрдВрдд



// рдореБрдЦреНрдп рддрд░реНрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдмреВрд▓ BasicBlockStats :: runOnFunction ( рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдл )

{

// рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмреЗрд╕ рдмреНрд▓реЙрдХ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ

рдХреЗ рд▓рд┐рдП ( рд╕рдорд╛рд░реЛрд╣ :: iterator I = F. start ( ) , E = F. end ( ) ; I ! = E ; I ++ ;

{

NumberOfInstructions + = I - > рдЖрдХрд╛рд░ ( ) ;

}



// рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝реЗрдВ

NumberOfBasicBlocks + = F. size ( ) ;

рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;

}
рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд╕рдВрднрд╡ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ:

g ++ -c -fPIC BasicBlockStats.cpp -o BasicBlockStats.o -I .. / / -I .. / build / рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ -D__STDC_LIMIT_MACROS -D__STDC_CSTSTANT_MACROS

gcc -sared -s BasicBlockStats.o -o BasicBlockStats.so
рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ SQLite рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреЙрдореНрдмреИрдЯ рдЯреЗрд╕реНрдЯ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ред рдбрд╛рдЙрдирд▓реЛрдб sqlite-amalgamation-A_B_C_D.zip , рдЗрд╕реЗ рдХрд╣реАрдВ рдЕрдирдкреИрдХ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдкрд┐рдд LLVM рдФрд░ llvm-gcc рдирд┐рд╖реНрдкрд╛рджрдиреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде BasicBlockStats.so рддрдХ рдХрд╛ рд░рд╛рд╕реНрддрд╛ $ PATH рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред

# рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ SQLite рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рд▓рдирд╛

llvm-gcc -emit-llvm -c sqlite3.c -o sqlite3.bc



# рд╣рдорд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ

# -рд╕реНрдЯреИрдЯ рдПрдХрддреНрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╕рднреА рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ

рдСрдкреНрдЯ sqlite3.bc- рд▓реЛрдб BasicBlockStats.so -basic - block- рд╕рд╛рдВрдЦреНрдпрд┐рдХреА -stats -o sqlite3.bc



 === ----------------------------------------------- -------------------------- === <br/>
 ... рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░рд┐рдд рдХрд┐рдП рдЧрдП ... <br/>
 === ----------------------------------------------- -------------------------- === <br/>
 <br/>
 8 рдмреБрдирд┐рдпрд╛рджреА-рдмреНрд▓реЙрдХ-рдЖрдБрдХрдбрд╝реЗ - рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдФрд╕рдд рд╕рдВрдЦреНрдпрд╛ <br/>
 18871 рдмреБрдирд┐рдпрд╛рджреА-рдмреНрд▓реЙрдХ-рдЖрдБрдХрдбрд╝реЗ - рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ <br/>
 153836 рдмреБрдирд┐рдпрд╛рджреА-рдмреНрд▓реЙрдХ-рдЖрдБрдХрдбрд╝реЗ - рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 
рддреЛ, SQLite рдХреЛрдб рдореЗрдВ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдФрд╕рдд рдореВрд▓реНрдп 8 рд╣реИред



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



All Articles