Upgrade to Pro — share decks privately, control downloads, hide ads and more …

libdcompile

 libdcompile

LLVMとclangを使ってC++を実行時にコンパイルする方法を解説します

Fadis

May 09, 2015
Tweet

More Decks by Fadis

Other Decks in Programming

Transcript

  1. libdcompile
    Naomasa Matsubayashi

    View Slide

  2. @fadis_
    ࠷ۙ࿩୊ͷ๭"ࣾ
    $
    7JN
    (FOUPP
    มଶΛࣝผ͢Δཁૉ

    View Slide

  3. int main() {!
    float a = 5.0f;!
    std::vector< boost::filesystem::path > f;!
    f.push_back( "hoge.cpp" );!
    f.push_back( "fuga.cpp" );!
    dcompile::dynamic_compiler dc;!
    dc.getLoader().enableSystemPath();!
    if( !dc.getLoader().load( "jpeg" ) )!
    throw Ouch();!
    dc.getHeaderPath().enableSystemPath();!
    dcompile::module lib = dc( f.begin(), f.end() );!
    boost::optional< dcompile::function > foo =!
    lib.getFunction( "foo" );!
    if( foo )!
    (*foo)( &a );!
    else!
    throw Ouch();!
    std::cout << a << " outside" << std::endl;!
    }

    View Slide

  4. $ʹແͯ͘൵͍͠΋ͷ
    FWBM

    View Slide

  5. FWBMͱ͸
    1FSMͷ৔߹
    FWBMQSJOUa)FMMP 8PSMEaOa
    ͔͜͜Β ͜͜·Ͱ
    จࣈྻ
    จࣈྻͰ༩͑ΒΕͨίʔυΛ࣮ߦ͢Δ

    View Slide

  6. FWBMͱ͸
    จࣈྻͰ༩͑ΒΕͨίʔυΛ࣮ߦ͢Δ
    @45%*/
    FWBM@
    ਖ਼͍͠
    DBUIPHFQM
    @45%*/
    FWBM@
    FDIPQSJOU)FMMP 8PSMEaOcQFSMIPHFQM
    )FMMP 8PSME

    View Slide

  7. FWBMͱ͸
    DBUIPHFQM
    @45%*/
    FWBM@
    FDIPQSJOU)FMMP 8PSMEaOcQFSMIPHFQM
    )FMMP 8PSME

    ॲཧ಺༰͕QSJOUʹܾ·ͬͨͷ͸࣮ߦ࣌
    ࣮ߦ࣌ʹίʔυΛղऍͯ͠
    Ϛγϯޠʹམͱ͢खஈ͕ඞཁ

    View Slide

  8. FWBMͱ͸
    ࣮ߦ࣌ʹίʔυΛղऍͯ͠
    Ϛγϯޠʹམͱ͢खஈ͕ඞཁ
    1FSM 0, 3VCZ 0,
    1ZUIPO 0, +BWB4DSJQU 0,
    $ PS[ $ PS[
    % ίϯύΠϧ࣌ͷΈ +BWB PS[
    $ 0, )BTLFMM 0,
    ίϯύΠϥ͕ϥΠϒϥʹؚ·Ε͍ͯΔ

    View Slide

  9. ϥΠϒϥϦʹͳͬͯΔ$ίϯύΠϥ
    --7.DMBOH
    ͜ΕΛ࢖͑͹$ͰFWBMͰ͖Δ͸ͣ

    View Slide

  10. MJCEDPNQJMF
    IUUQTHJUIVCDPN'BEJTMJCEDPNQJMF

    View Slide

  11. Ϛγϯޠ
    Ϛγϯޠͷੜ੒
    DMBOH --7.
    VTFS
    $
    #$
    $
    #$
    ߏจղੳ
    #$*3
    ϦϯΫ

    View Slide

  12. --7.͸ಡΈࠐΜͩ#$ͷѻ͍Λ
    छྨ͔Βબ΂Δ
    ίϯύΠϧ
    Ϛγϯޠʹม׵ͯ݁͠ՌΛ
    ϑΝΠϧʹॻ͖ग़͢
    ΠϯλϓϦλ ߦͮͭಡΈࠐΜͰ࣮ߦ
    +*5ίϯύΠϧ
    ඞཁ࠷খݶͷ෦෼͚ͩΛ
    ίϯύΠϧ͠ͳ͕Β࣮ߦ
    ௨ৗ$ͷίʔυΛίϯύΠϧ͢Δ৔߹
    ʮίϯύΠϧʯ͕༻͍ΒΕΔ

    View Slide

  13. FWBMΛ͢Δ৔߹ίϯύΠϧΛ͢΂͖Ͱ͸ͳ͍
    --7.ʹ͸&-'ͱ͔1&ͱ͔Λѻ͑ΔϦϯΧ͕ͳ͍
    3FRVJSFNFOU(/6CJOVUJMT
    ͱͯ΋͔ͳ͍͠
    ίϯύΠϧҎ֎ͷํ๏Ͱ࣮ߦ͢Δͱ
    ෆࢥٞͳྗʹΑΓԿࣄ΋ແ࣮͘ߦग़དྷΔ

    View Slide

  14. ϦϯΧΛ࢖ΘͣʹͲ͏΍ͬͯ
    ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔
    --7.͸ΠϯλϓϦλ΍+*5Ͱ࣮ߦ͢Δࡍ
    ಉҰ#$தʹݟ͔ͭΒͳ͍γϯϘϧΛ
    EMGDOͰ୳ͦ͏ͱ͢Δ
    άϩʔόϧม਺
    JOUB
    ίϯύΠϧ࣌ίϯύΠϧ෼
    JODMVEFJPTUFSBN
    FYUFSOJOUB
    JOUNBJO
    \
    TUEDPVUB
    TUEFOEM
    ^
    ࣮ߦ࣌ίϯύΠϧ෼
    ݟ͑Δʂ

    View Slide

  15. --7.͸ΠϯλϓϦλ΍+*5Ͱ࣮ߦ͢Δࡍ
    ಉҰ--7.*3தʹݟ͔ͭΒͳ͍γϯϘϧΛ
    EMGDOͰ୳ͦ͏ͱ͢Δ
    ϦϯΧΛ࢖ΘͣʹͲ͏΍ͬͯ
    ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔
    EMGDOͰݟ͔ͭΔ΋ͷ
    ݩʑόΠφϦதʹ͋ͬ
    ͨγϯϘϧ
    35%-@(-0#"-Ͱ
    ϩʔυͨ͠γϯϘϧ
    ͋Β͔͡ΊඞཁͳϥΠϒϥϦΛEMPQFOͯ͋͠Δͱ
    ࣮ߦ࣌ʹίϯύΠϧ͞ΕΔίʔυͷத͔Β
    ͦͷϥΠϒϥϦͷؔ਺͕Կͱͳ͘ݺ΂Δ

    View Slide

  16. ϦϯΧΛ࢖ΘͣʹͲ͏΍ͬͯ
    ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔
    EMGDO͸104*9ݻ༗
    --7.ʹ͸
    γεςϜͷμΠφϛοΫϩʔυΛந৅Խͨ͠
    ؔ਺͕༻ҙ͞Ε͍ͯΔ
    ͨͩ͠ϩʔυ͚ͩ
    MMWNTZT%ZOBNJD-JCSBSZ-PBE-JCSBSZ1FSNBOFOUMZ

    View Slide

  17. ϦϯΧΛ࢖ΘͣʹͲ͏΍ͬͯ
    ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔
    JODMVEFKQFHMJCI
    JOUNBJO
    \
    TUSVDUKQFH@DPNQSFTT@TUSVDUDJOGP
    KQFH@DSFBUF@DPNQSFTT DJOGP

    ^
    MJCKQFH͕ཁΔ
    ࣮ߦ։࢝
    MJCKQFHΛ
    μΠφϛοΫϩʔυ
    ࠨ্ͷίʔυΛ
    +*5ίϯύΠϧ
    ͜ͷ࣌఺ͰEMGDO͔Βݟ͑Δͱ͜Ζʹ
    MJCKQFHͷγϯϘϧ͕͋ΔͷͰ
    Կࣄ΋ແ͔͔ͬͨͷΑ͏ʹ࣮ߦग़དྷΔ

    View Slide

  18. int main() {!
    float a = 5.0f;!
    std::vector< boost::filesystem::path > f;!
    f.push_back( "hoge.cpp" );!
    f.push_back( "fuga.cpp" );!
    dcompile::dynamic_compiler dc;!
    dc.getLoader().enableSystemPath();!
    if( !dc.getLoader().load( "jpeg" ) )!
    throw Ouch();!
    dc.getHeaderPath().enableSystemPath();!
    dcompile::module lib = dc( f.begin(), f.end() );!
    boost::optional< dcompile::function > foo =!
    lib.getFunction( "foo" );!
    if( foo )!
    (*foo)( &a );!
    else!
    throw Ouch();!
    std::cout << a << " outside" << std::endl;!
    }
    f.push_back( "hoge.cpp" );!
    f.push_back( "fuga.cpp" );
    dcompile::dynamic_compiler dc;
    dc.getLoader().enableSystemPath();!
    if(!
    !dc.getLoader().load( "jpeg" ) )!
    throw Ouch();
    dc.getHeaderPath()!
    .enableSystemPath();
    dcompile::module lib =!
    dc( f.begin(), f.end() );
    boost::optionaldcompile::function!
    > foo = lib.getFunction( "foo" );
    (*foo)( &a );

    View Slide

  19. #include !
    extern "C" void moo( float *a );!
    extern "C" void foo( float *a ) {!
    struct jpeg_compress_struct cinfo;!
    jpeg_create_compress( &cinfo );!
    moo( a );!
    }
    #include !
    extern "C"!
    void moo( float *a ) {!
    std::cout << *a << " inslide" << std::endl;!
    std::cout << "Hello, world!" << std::endl;!
    *a += 0.1f;!
    }
    IPHFDQQ
    GVHBDQQ

    View Slide

  20. ಉҰϓϩηε
    ϗετίʔυ
    MJCKQFH
    NBJO
    qPBUB
    IPHFDQQ
    GPP
    GVHBDQQ
    NPP
    ॲཧͷྲྀΕ
    JOTMJEF
    )FMMP XPSME
    PVUTJEF
    ͳΜ͔
    ૿͑ͯΔ

    View Slide

  21. %ͳΜͱ͔͞Μ͕࡞ͬͨ
    #0045@11ͩΒ͚ͷίʔυ΋
    தͳΜͱ͔͞Μ͕࡞ͬͨ
    DPOTUFYQSͩΒ͚ͷίʔυ΋
    ࣮ߦ࣌ʹ࣮ߦग़དྷΔʂ
    ͍͢͝ʂ
    ࠷ॳ͔Β࣮ߦ࣌ʹॲཧ͢ΔΑ͏ʹॻ͚ʂ

    View Slide

  22. DMBOHͷา͖ํ
    DMBOHͷιʔεʹؔ͢Δ࠷௿ݶͷυΩϡϝϯτ
    ͦΕ͸EPYZHFO
    DMBOHͷιʔεʹؔ͢ΔৄࡉͳυΩϡϝϯτ
    ͦΕ͸ιʔε
    Θ͔Βͳ͍͜ͱ͸ιʔεʹฉ͚

    View Slide

  23. DMBOHͷา͖ํ
    --7.ͱDMBOHͷࠓ͕Θ͔Δ
    ߪಡ͸ແྉ
    HJUDMPOFIUUQMMWNPSHHJUMMWNHJU
    DEMMWNUPPMT
    HJUDMPOFIUUQMMWNPSHHJUDMBOHHJU
    ࠓ͙͢DMPOF

    View Slide

  24. DMBOHͷา͖ํ
    ͰɺͲ͔͜ΒಡΊ͹ྑ͍ͷ
    NBJOؔ਺͔ΒͩΖKL
    0XOJOH1US$PNQJMBUJPO$ 5IF%SJWFS#VJME$PNQJMBUJPO BSHW


    JOU3FT
    DPOTU$PNNBOE'BJMJOH$PNNBOE
    JG $HFU


    3FT5IF%SJWFS&YFDVUF$PNQJMBUJPO $ 'BJMJOH$PNNBOE

    --7.@4063$&@%*3
    UPPMTDMBOHUPPMTESJWFSESJWFSDQQ
    DMBOHίϚϯυͷNBJOؔ਺ͷࡏॲ
    ߦ໨͋ͨΓ͔ΒNBJO

    View Slide

  25. DMBOHͷา͖ํ
    JOU3FT$&YFDVUF+PC $HFU+PCT
    'BJMJOH$PNNBOE

    --7.@4063$&@%*3
    UPPMTDMBOHMJC%SJWFS%SJWFSDQQ
    ߦ໨͋ͨΓ͔Β&YFDVUF$PNQJMBUJPO
    --7.@4063$&@%*3
    UPPMTDMBOHMJC%SJWFS$PNQJMBUJPODQQ
    ߦ໨͋ͨΓ͔Β&YVFDVUF+PC
    MMWNTZT1SPHSBN&YFDVUF"OE8BJU 1SPH "SHW
    FOW 3FEJSFDUT
    TFDPOET5P8BJU NFNPSZ-JNJU
    &SSPS

    ॲཧͷஈ֊ຖʹ෼ׂͯ͠DMBOHΛݺͼ௚͢

    View Slide

  26. DMBOHͷา͖ํ
    JG BSHWTJ[F
    4USJOH3FG BSHW<>
    TUBSUTXJUI DD

    \
    4USJOH3FG5PPMBSHW<>
    !
    JG 5PPM

    SFUVSODD@NBJO BSHWEBUB
    BSHWEBUB
    BSHWTJ[F
    BSHW<>
    WPJE
    JOUQUS@U
    (FU&YFDVUBCMF1BUI

    JG 5PPMBT

    SFUVSODDBT@NBJO BSHWEBUB
    BSHWEBUB
    BSHWTJ[F
    BSHW<>
    WPJE
    JOUQUS@U
    (FU&YFDVUBCMF1BUI

    !
    3FKFDUVOLOPXOUPPMT
    MMWNFSST
    FSSPSVOLOPXOJOUFHSBUFEUPPM5PPMaO
    SFUVSO
    ^
    --7.@4063$&@%*3
    UPPMTDMBOHUPPMTESJWFSESJWFSDQQ
    ߦ໨͋ͨΓ͔ΒNBJO

    View Slide

  27. DMBOHͷา͖ํ
    MMWN*OJUJBMJ[F"MM5BSHFUT

    MMWN*OJUJBMJ[F"MM5BSHFU.$T

    MMWN*OJUJBMJ[F"MM"TN1SJOUFST

    MMWN*OJUJBMJ[F"MM"TN1BSTFST

    --7.@4063$&@%*3
    UPPMTDMBOHUPPMTESJWFSDD@NBJODQQ
    ߦ໨͋ͨΓ͔ΒDD@NBJO
    MMWNͷ͍͍ՃݮͳॳظԽ
    4VDDFTT&YFDVUF$PNQJMFS*OWPDBUJPO $MBOHHFU


    --7.@4063$&@%*3
    UPPMTDMBOHMJC'SPOUFOE5PPM&YFDVUF$PNQJMFS*OWPDBUJPODQQ
    bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
    ߦ໨͋ͨΓ͔Β&YFDVUF$PNQJMFS*OWPDBUJPO

    View Slide

  28. DMBOHͷา͖ํ
    ௒ॏཁΫϥε$PNQJMFS*OTUBODF
    $PNQJMFS*OTUBOD
    'JMF.BOBHFS
    4PVSDF.BOBHFS
    %JBHOPTUJDT "DUJPO
    5BSHFU0QUJPO

    View Slide

  29. DMBOHͷา͖ํ
    ௒ॏཁΫϥε$PNQJMFS*OTUBODF
    Success = Clang->ExecuteAction(*Act);
    --7.@4063$&@%*3
    UPPMTDMBOHMJC'SPOUFOE5PPM&YFDVUF$PNQJMFS*OWPDBUJPODQQ
    ߦ໨͋ͨΓ͔Β&YFDVUF$PNQJMFS*OWPDBUJPO
    OwningPtr Act(CreateFrontendAction(*Clang));
    "DUJPOΛ$PNQJMFS*OTUBODFʹ౉ͯ͠
    &YFDVUF"DUJPO͢Δ
    $PNQJMFS*OTUBODF͕ύʔαΛݺͼग़͠
    ߏจղੳͷ݁Ռݟ͔ͭͬͨཁૉʹԠͯ͡
    "DUJPOͷରԠ͢Δϝϯόؔ਺͕ݺ͹ΕΔ

    View Slide

  30. DMBOHͷา͖ํ
    ࠷ॳ͔Β༻ҙ͞Ε͍ͯΔΞΫγϣϯ
    &NJU"TTFNCMZ"DUJPO &NJU#$"DUJPO
    &NJU--7."DUJPO &NJU--7.0OMZ"DUJPO
    &NJU$PEF(FO0OMZ"DUJPO
    &NJU0CK"DUJPO
    0CK·Ͱ͍࣋ͬͯͬͯ͠·͏ͱ
    ϦϯΫग़དྷͳͯ͘٧Ή

    View Slide

  31. --7.ͷา͖ํ
    ෳ਺ͷ--7.Ϟδϡʔϧ CDͱ͔͍ͭͯΔ΍ͭ
    Λ
    ͭͷ--7.Ϟδϡʔϧʹ·ͱΊΔ
    --7.-JOLFSʹ౉͞ΕͨϞδϡʔϧ͸
    --7.-JOLFS͕ղ์͢Δ
    --7.-JOLFS͕࡞ͬͨϞδϡʔϧ΋
    ໌ࣔతʹࢦఆ͠ͳ͍ͱ--7.-JOLFS͕ղ์͢Δ
    #$
    #$
    #$
    ϦϯΫ

    View Slide

  32. --7.ͷา͖ํ
    ग़དྷ্͕ͬͨϞδϡʔϧ͸
    Ͳ͏΍࣮ͬͯߦ͢Ε͹͍͍ͷ
    ιʔεʹฉ͚ʂ
    --7.@4063$&@%*3
    UPPMTMMJMMJDQQ
    ߦ໨͋ͨΓ͔ΒNBJO
    *OJUJBMJ[F/BUJWF5BSHFU

    *OJUJBMJ[F/BUJWF5BSHFU"TN1SJOUFS

    ωΠςΟϒλʔήοτͷॳظԽ

    View Slide

  33. --7.ͷา͖ํ
    ϞδϡʔϧΛ&OHJOF#VJMEFSʹ౉͠
    λʔήοτΛࢦఆͯ͠
    ΠϯλϓϦλ࣮ߦ͔+*5ίϯύΠϧ͔બͼ
    &YFDVUJPO&OHJOFΛੜ੒͢Δ
    &OHJOF#VJMEFSCVJMEFS .PE

    CVJMEFSTFU."SDI ."SDI

    CVJMEFSTFU.$16 .$16

    CVJMEFSTFU."UUST ."UUST

    CVJMEFSTFU6TF.$+*5 USVF

    &&CVJMEFSDSFBUF

    View Slide

  34. --7.ͷา͖ํ
    &&SVO4UBUJD$POTUSVDUPST%FTUSVDUPST GBMTF

    ϞδϡʔϧͷίϯετϥΫλΛ࣮ߦ
    JOU3FTVMU&&SVO'VODUJPO"T.BJO &OUSZ'O *OQVU"SHW FOWQ

    ࢦఆͨؔ͠਺ΛNBJOؔ਺ͱݟͳ࣮ͯ͠ߦ
    ࣗ෼ͰҾ਺Λਖ਼͘͠ઃఆ͢Ε͹
    NBJOؔ਺ͱܕͷҧ͏ؔ਺͔Β࣮ߦ͢Δ͜ͱ΋Մೳ
    (FOFSJD7BMVF3FTVMUFOHJOFSVO'VODUJPO &OUSZ'O "SHT

    &&SVO4UBUJD$POTUSVDUPST%FTUSVDUPST USVF

    ϞδϡʔϧͷσετϥΫλΛ࣮ߦ

    View Slide

  35. MJCDMBOHʹ͍ͭͯ
    DMBOHͷϥΠϒϥϦͬͯࠓྲྀߦͷMJCDMBOH
    ͕͍ͪ·͢
    DMBOHͷϥΠϒϥϦ܉ஂ
    MJCDMBOH"3$.JHSBUF
    MJCDMBOH"45B
    MJCDMBOH"OBMZTJTB
    MJCDMBOH#BTJDB
    MJCDMBOH$PEF(FOB
    MJCDMBOH%SJWFSB

    MJCDMBOHTP
    DMBOHͷϥΠϒϥϦΛ
    $ݴޠΠϯλʔϑΣʔεͰ
    ϥοϓͨ͠΋ͷ

    View Slide

  36. MJCDMBOHʹ͍ͭͯ
    MJCDMBOH͞Μ͸
    ߏจղੳΛߦ͏ͱ͜Ζ·Ͱ͔͠ϥοϓ͍ͯ͠ͳ͍
    MJCDMBOHͰݡ͍γϯλοΫεͱ͔͸͋ͬͯ΋
    MJCDMBOHͰίϯύΠϧͱ͔ฉ͔ͳ͍ͷ͸ͦͷͨΊ
    $FS͸ϥούΛհ͞ͳͯ͘΋
    શͯͷϥΠϒϥϦΛར༻Ͱ͖Δ
    MJCDMBOHͱ͔͍ΒΜ͔ͬͨΜ΍ʂ $FSʹݶΔ

    View Slide

  37. ϦϯΫ͢΂͖ϥΠϒϥϦ
    2DMBOHͱ--7.ͷϥΠϒϥϦ͸୔ࢁ͋Γ·͕͢ɺ
    ࣗ෼ͷίʔυΛಈ͔ͨ͢Ίʹඞཁͳͷ͸
    ͲΕͱͲΕͰ͠ΐ͏
    ͲͷγϯϘϧ͕ͲͷϥΠϒϥϦʹؚ·Ε͍ͯΔ͔͸
    Ͳ͜ʹ΋ॻ͔Ε͍ͯͳ͍
    "શ෦ϦϯΫ͔ͯ͠Βͭͮͭ֎ͯ͠Έͯɺ
    ϦϯΫΤϥʔ͕ग़ΔϠπ͸࢖ͬͯΔʂ

    View Slide

  38. ϦϯΫ͢΂͖ϥΠϒϥϦ
    MJCDMBOH"3$.JHSBUF MJCDMBOH"45B MJCDMBOH"OBMZTJTB
    MJCDMBOH#BTJDB MJCDMBOH$PEF(FOB MJCDMBOH%SJWFSB
    MJCDMBOH&EJUB MJCDMBOH'SPOU&OEB MJCDMBOH'SPOU&OE5PPM
    MJCDMBOH*OEFYB MJCDMBOH-FYB MJCDMBOH1BSTFB
    MJCDMBOH3FXSJUFB MJCDMBOH4FNBB MJCDMBOH4FSJBMJ[BUJPO
    MJC--7."TN1BSTFSB MJC--7."TN1SJOUFSB MJC--7.#JU3FBEFSB
    MJC--7.&YFDVUJPO&OHJOF MJC--7.+*5B MJC--7..$+*5B
    MJC--7.$PEF(FOB MJC--7.JQPB MJC--7.$PSFB
    MJC--7.-JOLFSB MJC--7.*OTUSVNFOUBUJPOB
    MJCEDPNQJMFͷ৔߹

    View Slide

  39. ݱ࣌఺Ͱͷ՝୊
    ࣮ߦ࣌ίϯύΠϧ͞Εͨίʔυͷؔ਺ݺͼग़࣌͠
    Ҿ਺ͷੵΈํ͕ಾ
    ݱঢ়όΠτҎԼͷQPEܕ͔͠౉ͤͳ͍
    ϓϦϓϩηοαεςʔδͷΈ࣮ߦ͕Ͱ͖ͳ͍
    ݱࡏ࣮૷࡞ۀத
    --7.ͷόʔδϣϯ্͕͕Δͨͼʹ
    ΠϯλʔϑΣʔε͕มΘΔ

    View Slide

  40. ݁࿦
    $Ͱ࣮ߦ࣌ίϯύΠϧ͸
    Ͱ͖Δ

    View Slide

  41. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide