From f32aab51372a0873b1f68d8ee2a05f86a40dff05 Mon Sep 17 00:00:00 2001 From: Matthias Jurenz Date: Mon, 29 Aug 2011 15:43:17 +0000 Subject: [PATCH] Changes to VT: - configure: - patch Makefiles which define library targets that depend on other libraries to prevent the following Libtool warning: "libtool: link: warning: `...//*.la' seems to be moved" (Libtool getting confused by the "//" in the library paths, so remove the trailing '/' from all *LIBDIR variables.) - vtwrapper: - added options '-vt:showme-' to the compiler wrapper to show the compiler/linker flags that would be supplied to the underlying compiler This commit was SVN r25105. --- ompi/contrib/vt/vt/ChangeLog | 3 + ompi/contrib/vt/vt/configure.in | 14 + ompi/contrib/vt/vt/doc/UserManual.html | 2 +- ompi/contrib/vt/vt/doc/UserManual.pdf | Bin 497331 -> 497395 bytes .../contrib/vt/vt/tools/vtwrapper/Makefile.am | 1 - .../vt/vt/tools/vtwrapper/vt_wrapper.cc | 3795 +++++++++-------- .../vt/vt/tools/vtwrapper/vt_wrapper.h | 179 - 7 files changed, 2017 insertions(+), 1977 deletions(-) delete mode 100644 ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.h diff --git a/ompi/contrib/vt/vt/ChangeLog b/ompi/contrib/vt/vt/ChangeLog index 016491e1bd..4ec451992f 100644 --- a/ompi/contrib/vt/vt/ChangeLog +++ b/ompi/contrib/vt/vt/ChangeLog @@ -1,4 +1,7 @@ 5.11.2openmpi + - added options '-vt:showme-' to the compiler wrapper + to show the compiler/linker flags that would be supplied to the + underlying compiler - fixed segmentation fault in vtunify-mpi which might occur during gathering local marker definitions/spots to master process diff --git a/ompi/contrib/vt/vt/configure.in b/ompi/contrib/vt/vt/configure.in index 304c431fb8..9c27de00e4 100644 --- a/ompi/contrib/vt/vt/configure.in +++ b/ompi/contrib/vt/vt/configure.in @@ -450,6 +450,20 @@ AS_IF([test x"$have_mpi" = "xyes"], ACVT_CONF_TITLE([Final output]) AC_OUTPUT +# Patch Makefiles which define library targets that depend on other libraries +# to prevent the following Libtool warning: +# "libtool: link: warning: `...//*.la' seems to be moved" +# +# Libtool is getting confused by the "//" in the library paths, so remove the +# trailing '/' from the *LIBDIR variables. +# Actually, this should be done in the *.m4 files where the variables are being +# set, but it's less elaborate at this point. ;-) +makefile_to_patch="vtlib/Makefile tools/vtunify/mpi/Makefile" +for makefile in $makefile_to_patch; do + sed -e "s/^\(.*LIBDIR =.*\)\/$/\1/g" $makefile >$makefile.tmp + mv $makefile.tmp $makefile +done + # Generate MPI wrappers AS_IF([test x"$have_mpi" = "xyes"], [ diff --git a/ompi/contrib/vt/vt/doc/UserManual.html b/ompi/contrib/vt/vt/doc/UserManual.html index 4c58a07d1a..046685af42 100644 --- a/ompi/contrib/vt/vt/doc/UserManual.html +++ b/ompi/contrib/vt/vt/doc/UserManual.html @@ -66,7 +66,7 @@ BODY { font-family: sans-serif; }

-VampirTrace 5.11.1 User Manual +VampirTrace 5.11.2 User Manual


diff --git a/ompi/contrib/vt/vt/doc/UserManual.pdf b/ompi/contrib/vt/vt/doc/UserManual.pdf index 466967dad627cd7db117e10d5b7311883bfd19ce..2f607f86d5faf923ec1370dcaa9426a0714a88c4 100644 GIT binary patch delta 7811 zcmai22|QKX_wQcA4X+X*JtRdMGG|JL6cQ21tq9Si;*?4yR8L9+w~^GN z649j66DsmF8dLH7_i6goIq&oN`+V-_?AG3E*lVrtT5ETvK&z`jtFTv7P`>knCM|8g z&Nn_D(@Mg$1mGu>U|Lcq`=w}_WDeodlf+w`TtlCjE5N3h4v}T z?56Ao3T}!T20Ek61ii6i3zWLC0V;fh_P)5uUHepSR)rld?_OV8WrVb-7%nzmmOb!vA&)ftD&Su z8xJ=+IWjgzPk;TblSBS7P-{DA8vf#~*QN zbGdq>Jnda(p?9*vxOdOztO--kbgIR!P8-%QE6&uORc0+Q%MCqu5qq94`)~f@i<-*= zA(c-rLY1~(-uzr)^`(-lUAifmFLzuSrdia`TxdG#_zqoM!$>~tJ(d)9e~+?o%G|+n zgY*7TwJ#E$Uf$K(cW>jz!S~JC&GCV4&5D0V9ZixFA1hcpX^QKqIjI}q%WeBNbeK0R z?P(aQY$2B16&tDUxa=8p^YW#X=gQDb!8_%`lDe1kZhLx$L>I4l`})Hy+8{MRM(f-o zg#lw+7azV_<>k$yx(RNR+S+n9ZZ|*STKRmdSCoO5+`j|TBaK=*&(1jUdDe_qEn6Lr ztzZ1WyxTj)!6Rzhg#6EUU#^SVWF%4ub7eLhc&PHEb9}vk&-Ku*}RiyMRhwm&Kcd_{o z=a87er{3e|KcK})d1;ds+f}i%X^J-z2V|e5&&hdJRk6_zCm#nT#2agtH{M>$HR%Tgh7#7l!+FbIyT(ZWxWJsAyN>@U#j6Nf-3%e$W z)9MWul$}*idblJgqar20VBv}_e(E)M#dAN0&3BKw+n#RbKUB>qBr&Vt#r<;!tX{?J z*EK(l1uVNZv3ZAcwA=e7RW9xqX4MwUDI1-V{QcxOhhOX`99{bGP>gx9DyC=i|=$D8-J5;Hqnr|(DGYj*{w*08qq_Qd1K4|%xx4M5IN5t|8~01l9&wL zITtU^bsM_uz&O_@AI=_eK<`wHU-HRU^wc+a_&?*!_S=*{oGNxPFLBIUd{IdyE;v+Y z!Ofe8Lu?es{Hr6LHO-=OyhiHLA(e%uQ%mkA+PK%N`%_yjr|PCHP20K1$}1$mapfAQ zKXBJcb<5Jfvl`;|*Oc5ejIACzyvz7?PskmiXpfoCf$>8f-1a;th=e~5BfNP1mG;(_o*7S}%PF6bO_!AHTzZqzvJ`AA#G z_7S@r)sUTRGj<$?;rM(u)Z0ovYx1u`ml$&+)l535IObz67z^BCcTExH#hlxQclOEOg=SL{R znJLr$%pBpL7HIbIeEpoI_w>)t+)x@&dizlG`RtdAW~kngya#7f z;epz{T2<{^E9rA<-vow+?YJDd-Tg!H+x_yX$&NLTi$3H_A2)p5AXaU6(HpPqdLp7_ zvpcb(W>6Gfy~6w})(0m@(*WxP#-w>lPZ9sG(Ob-lI%DKCVN3BkU+aw<&N?oy&~NHn zpXa1BGHpuN{Nv)r$EiAg@^NzA2WR+~oG;mYI8*6N5VYtNk6&QW5m>St+UsiULl z8vzG3%?+$Fw|ScHqBeh8uk_D}2e}V0(O9+fsUhWUQ~K?gM+&h>?zF4MK3NlG#vagj zD{Bc@*PX36urQnM^sv%7P!^N)R*;aH?5_Vx=WXB7dn3n*B9^|m5kYO8yZhSwrkDxc z!u{J!_U9=ZcsJv|K7oaHZzwCcCljnrJ}tXIk|=Ld9q z^-9Zyx9U#}sT19hOMV4;oz_a)d_(q%abebUe|bgbiuRBJL!ETXoxa*x2@#9*5dHH5 zPD>gmt%^P-X`FO8>B6MbJtH&hYFa-IMvGtCr$4-LMrEP?w$W|9OM(s!M%JsR3*IC@ z8)^}7>8uKtnk0SymP^V=>w%Dtx7%i&b6#*>u(LFvyyRHp=y;oxXCBV%X|;c?>z98d zOJHIe9Y#T4F*$DSxVqNTV@VFWu3i&9$^>kA8{6SWl+D&> zY}2yzhP-zbUMi|hT4iK*IL=>J%{g{IcJb4QH#5>!WWS!F3aNx6pEYtGc@D=8Xc9BiepKU%!Iw{nSL;;qiR!b_OC=t)&l!*PqO z;0smfbvC?EOO)nP|A z8SYX$X*E|6l9N=quvfKrhMD!%T>%*z`-d1>`AtsS^HdmMas6DZrD5xntz%9Eo{j19 z?>5$GI5s!$w+h!LMb%6){#4fRSe<`I%qqMz_yya{?Mc#)WO0(3hR{rzi?ni5>11i} zlL0?jN$F(Kdrbkt6k3R)Z5GI5DQUud#2R3jBVu*QQfgvQ5$SzO_X6o1l0w{X( z!2-r0CUQQ|KtVXlRLlqL1i`4La0!c8k&fp7PT~5wGIsri#ljqDzM{uV1%NB5o3o9H3rmzdv z>{fPxBft_@u)shZ64?a`Tv_KT`a=cNhS)#t5N&z(ixD_`6FoQ4bX5fB?ZMzCk?bBt z^Y$Qcxe9iVq-5v@id1eXz`fcyQ~P4quDN#L1ccM&xjhA@Q3O3)Z1y9lrn z7|Pqk350QCH%W+Z5k{d*9=nM^e2Y+!0KM!cj_}1IAOz+f>^=F62uv{eD9v*^O0&7_DWU-!S9pp>2~mJ9a8y7sWu78sAqF#gULsPR1kt0o zPCyBaVj{hORv6-i48?JrsbDt|oOc%#1MXAx2Ad$qd16rlK*gJN0$(Kpa_f2othcbXt|-?LjC;N(f(3hb({?C7B!~k`V%& z(-LI4Xr4d@UIMOoV8oG+R6*!e|jJB}KqM zT&ze_3RD_kl33Iu1cG6S-3HMPp^%^?&k{t>ghC3JR3rgesuah22#5uRF=IA~CW<+U zfRHeW!@ph~&~TDRgK(IW@ZcOlbKHiID2(%H2>m_U;_t`?%oM>%JirVgJZ~Zh#8Zr+ zC?_!y5`$>IJP`a}E*AuWgP^$oLIgC>csN-FXgKyOGs_D)29K8@c*X#aGj~!%%3_3* zb3iQ3R}TsY=iUfOp?s4lm~RpZBRv05$TyS3KT0V=(ge)A4~?Nb8b~dke`tVB&b=uZ zV1P@5DB>4m#1L>AP4c`zK{Um2Bmg+dMJPhSG#6ihMnPO}QNRgYPXk_LJ~yfqO7fyb zf#Slu2?9eL0}%=Z1B74;h$_Yti;)D6hEg<71V-`D30%hKB_MA1K`0y|zC!D#s8R%I zg4`&OIK_nm1xg3+js!~cXe5XOR~`+9s-J0WR4JOExv4{uB+Lar1p>`65NP119SwmY z;AbU32N=3I_+@DjDdrzUxSa~25g6yD2^dcJN)U*bcEA|=mm9Ojfb{(4nIBaQB?w?5 z*J_O5<_9>3;@pscIgFRbG(vDM0(fEaSFeg8Km-Q;su(mupqWP_xXlZkBS|hV3GVT$ z5}<=dzt`>WWgFcKe-{f=<)xA71q z5uE%^{6T~GR)em@b1R7fOmL0Hk^e9T=hDQ$8qhI#%n&!>K&In3M+t`0KnstTmmesJ zg8*>P5ugfb1N?!%A29)?2j_VKG;wY`Nf36PK=7L4z!RkiP$W5u!BqUM_yE1)Z__!1 zlH68-L7)$Fk_!WH=PCv?kpI6b!9d5OIbH=p2TwiDIWd?;_-+MlfdfV0YM6^-5E26A zcm~iwHgJ>xPZJz3fO9lEEq(F-clU$d0g3~M8T5ZHwlNY+)m(w#RmP1mILAwBKqG%D z%i^z(BN74t;E6_|Bs0i121xJ_5&J@a}$#UAmbncoCEme8jZm} zm-H|3$4KyU;xS|Rk1F;34NI~oc>;M89|i_-zR}>nDtN}=VlbL=1>&IT^Jw%>N%Jjd zKs(^Vi3E7(@q(8cpN4-$6S)8X+)wa&KA43lgbPIybSIwC;3>@W3@BW@+#*53{d74w z5Pu9j#le$MDMK{d8%(w|Z3@qZ%n=B~O;ExFor9PWY`vRpO3$Hl1nI|L#c!! zp-_niA}Jw>GWWmR{c!Dl*ZR*|XYKbq?=#Q)^qo{cb5cFOUrpjc>VO(8X@1yyb2O$N zhp9_|uRx5c56$~B6ow#XWb9CVQIb>BiYDrh^#jgtf`YI^R_?Df$7u#VG?!D#&~0sr z3sm>pRw&h}yshAA%*;}44<)M|O)(N~6Mb)I(x_R&!6{muDOK0%mwl^Pq-ouIw=eMQ z!-G=gQATpUxatTRtSC1unbL z7?xT2rfbhZnc-!E>@$lGMq@TR0u(QX|GC<>R(sS_sYVmQJPIbXAi0^ z`f{mqQ$WBXsMGZNT6aG?#>-FEW@zAonjq0ZS%K2Uvu=)`V%@IFP8 zWBWwgEc>tOU@D)I1bLk*WjFZ2Sd z@Z4xE=VSG{_nQt(eb*B=VvK^u?DfLW+e^*WUS60x`qf;I_?^pdC~ZC#*E&@)xcOwm zqv6mdQRv*kYu>tz-A4+V6LKLVi9W?Q#uD8D=LVO(s(6;HR}to0BD}G3|DSV1YATa^ z`j1)VuDp~BC7s%(=V0q`P4Bir)~mgiD-A!aBHu2o@U%VnSby} zntgTpNP6=6YnD^xSE=RP*7DH3Ml~fXSpEH4c8bR^{rc_@l>oJK8#MCaN!@8zhREn| zF_IcF`l_%%w4uz{++$(ybhs!#yQ9b@>GXXv{fmOy?(XSU$;!Fr`%TZ=o193AUi`>T za+&*?+0M;|MWw6itsC@Pf{Qd(yzZ%dp{$19vN5etnVjP573}8if{l6J7IH~d;`y_N z=G|8`A)9@g(RH~Or`p8DM7=w+cZkjd%aERForg3IoArGYMc|$-U*0DSkBZc}G`Okh z)rdd0L^pk?`J53~Y%;lUjbrA4o_GG&tc@R4-`$#n^-UV_d}rmCO=l)OTdj9Dd-Td# z>w7KSJzdr;4SpJbu7o=7R(hv-*#7m!WIGDUo3GlR-!){<+dSzNtH&IO`WSmsLh&%%}+uJ#jB3#;U|tD`-!5$+-^2 zmF3mg?bVp_i6D1PzsfBOjS$IiHB!2sq08p#1iB@4NX|D%ee{0o8%EVY^~%-AN0za{ z`y%?vUORl$ZU5-#6=ho^Y@H?=l9t^bz?4svR1`~TNM4eVgdvzhqYJa4MY5b*1#q{9VIoN zFXqY5kC2<++AqIatHOTq0XxnV|$LnU~MgEDZRY2kQMFp|(;)Su^b0eEqE^iu^mKQx^)mG`EEdO*|ecqhR z*pWHMiL?94Jst7dOLhz9p{M)Eg4+E-#BnbLkMioaAvGt1`i>?%uCp(T>RB`3kreq1 zx~q2Oab4*KGwUI~J(m{UTa|Xy6mhaJ%P!U))~dZ+>h%Pb>22}3V?z=b9}cMyos}~9 zl5yMRyr6kuP-5-l5xvZ(x)iPP+eSa%?@KA>4pc{3jS2LV*6Xq!8v)RRMms`V=}YF0M&CB+jVZfS zCyn0WsCjgH=#j!gU-D*6%#(lvuM0@gai6ypa@AY6r^QU%Q5q~e#l3Q8>nq>hQMxLJ zqY@RRk>;h#^KB!|o;2DCN)l50F6%2a28X!XmKYT6X$}}`F_?5&{T|+Sxj`noM^U6^ zb?e2JX-h{v*0o4l)jwyy<1O{g&1o_px8x&6Yu~Dgw{}=<{3~2O)!n?n&-`onkmrAh zeEyDeHZ^exTw-lmp(U4kBd6xYdvDqEdOI!WM@-S_l?V=veKu8F!N1_@kg~(dGp{C+Nub{ISTzSRrc9auR7VJ$k#h z{Il;jFRA*#85a#i?QN|o1{)D_y~nzXgP+_t2r8Ey@}K%iMUc4qG!^q!s$(DeN&jYB z?I!Pq5ZY8KDQ&tY{`yVxF%!;rW=}p-@v3R`_0Tpe->QFNQJ-Ckyq|3-eq{#{Ctjm5Oz=ADEnRTL09tn81=qQRI7@6e*aW-5vV*Vcs6I7WIemg!+r?`BG8=b+wzueJ<-5 z?y4oXe8no!}&qzwFqsDaSgeZYQcPn@4u*`rB((MQhzF zv`=uHRFyPXdL?1J{*I9!Hkm0rzj>3^zM&NKhxwqb@sZR4#w5`wWn$vTN$!Vt@0^ru zuLO_UGQrxpGvd=2jOJ!a4#u9JtC=JSV&tCgxgTtrJ#kQqadLC?xo-{G+h4%PS%95WRzxvaB za>xdW>zdo{1c#lSon>b=3dxV`RGsyA_XnB!U0c`UuG2@gn;6;{*;tO+PQ^R4Us0W% zo?IcS4tDN(FxVBRvVXz!lC$R(cU(N>d1!;j)NKw&0>-N*Y#%f7k$2V# z`D=-t>MLdTNgQ$Vd!ksY`lRfJQPZL$_ZH1NYH-h{>(vN{W``GH%f*ptch=vFUn*KZ zQ?<4X?biLdsyl0-M3F{;Wqd%h`b2Mq zCFHW|+=S{1yZl>~?}F7rUo{k}9JaPAxqd^jqNuUD;(mfk^3tF}t>Ag}>3+u~JbcGq zUb9K%@PspKl%3b@J6GHh?DprKknAY`q6c*nQ$uU}^0ed1sJ!M&Qm(th^jj~CQku4W zz(ACovMuWAwQ+gLDhG3t1SS*8*J&KE0xyj zTF37zp1iuMUiwt8*@1Tpwydgu`PpnhGvIaXiV2|=XV%P~wf2tUh15jRVp(yEzU-p|;<^gcj)D`0U0z0x?;rG4+8=PQmAX{DW`U1Q>3W6N>I1E93noq0 z$x2-3Im4^QYo^RgALzL`xn-zjDCHn&1b7qUg_9qk@Pns z&9IzlXC_UsYX3G4B4jqtln@O$p<$TKPGBWwgn{IJX@VlA5;WsAQ&KT*&_EJ=rNCEO zJZK<%qb30}Z{`RiWl4m95uCsYCd5jp`mdjH?aDH3HOtc5m1NgQD+*#kjAjPhJ? zz-f%}VGkGyGllE{rAbD5p3qhRLyQyqL{KJY9=L!pn(6-zAQ%f9;XFx-2JF&pz!gPO zOb2@)X@ntc!GQoO$JzpFh+-PpCxS4#cHja-2_}L)pajZPvIhhu8D)ELfC0pZJwPPE z6xss`Bu&wbv;)fqVVu|}j59gx6Cs#>_KD(*#e6`5gSM1DpS{4D4i=Pq!))F6A;dEsb;@v^Ol0x4tt6G$0Z4Yyl@jzV;Ys0ycL6BAW~jo5(Zwk z@L~xG9#aT|#OYo_2?^kJ9$SbeDCX2sVSzHjze6Zg9N{hOl?ELG6Z`uMr36DE3Kxe4 z3hgAMaGEA)ab=M3kc0q6#QwoTV+l}q;^QI0;gSNF78ivJV3wH_x5GK}&5k3(J5Lhg|74TA~;oogRNC*O*#dVudPsB-C zgoJ^LTy&V=`Vp|eVUmYOqMTSDBnnX+S0W@r{fM^cM_mKKG{j?w&;&;rj6h(Nr!)r0 zxyoP=w?6=7K=6OV6F~@xf!6*T5WsMfo67)(QNI(jv|wKFXbFg?3_<^}_?N*1N#G(L zF~wJgptzNTkQB;Skb?LMf;jQKMIk>G6#cKQA|#FDJnLwbG&bCV0i9pTn1LV?D>$qxV{F+L3D%YZ2Y)fBNa<>zn#bxQtp z%@5B|pw;j!K_HYHcM8Q}j&&f0Mn5J6H#C(;&gk2B0*F*h`?D04@QC}%*CU@y2XP5VlIp%FreUf|Nkrr ziY9T6h9K_zB%~p*9&i}a5X`A6P{p{*Y#)w z!8o2l37qCmDufncI5$C1u!7LskkA!M0~AD6y~{=#6U~pDhLK3Um1)K1AT#~ASlo8Fkt@=_p^3T z93f!6!w8;da9(}@b3xK@6$GP_4+BB|7ar?>lmsE>CJhOO6OR}~qVT|CMkYG3r^SugY#6L|+ z^vnG?4Rh-lgajwJmJkTR9mfC=#q*myZz58%;!&w!V2Uc!+uckc&18Tq$y;h|oC z1uhSjGcwX-eA9)7ODIzc2ZLZXFoYy1Q`E%N)MPedVrph)N)fb$xv{3v|BK?TX>2SP a7VZ@qzB+Wdj~tK*{sfZK(J{BPko!L+Zk|#A diff --git a/ompi/contrib/vt/vt/tools/vtwrapper/Makefile.am b/ompi/contrib/vt/vt/tools/vtwrapper/Makefile.am index b3ab0f9f29..78a97cabc2 100644 --- a/ompi/contrib/vt/vt/tools/vtwrapper/Makefile.am +++ b/ompi/contrib/vt/vt/tools/vtwrapper/Makefile.am @@ -162,7 +162,6 @@ LIBS = $(LIBS_FOR_BUILD) @CROSS_PREFIX@vtwrapper_SOURCES = \ vt_wrapper.cc \ - vt_wrapper.h \ $(top_srcdir)/util/installdirs.c \ $(top_srcdir)/util/util.c diff --git a/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.cc b/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.cc index 3433f68c43..27e7712584 100644 --- a/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.cc +++ b/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.cc @@ -10,1926 +10,2129 @@ * See the file COPYING in the package base directory for details **/ -#include "vt_wrapper.h" +#include "vt_inttypes.h" -static char * ExeName; +#include "util/installdirs.h" -int -main( int argc, char ** argv ) -{ - int rc; +#include +#include +#include +#include +#include +#include - // get name of executable - if( ( ExeName = strrchr( argv[0], '/' ) ) ) - ExeName++; - else - ExeName = argv[0]; +#include +#include +#include +#include +#include +#include +#include - // create instance of wrapper (initialize) - Wrapper * p_wrapper = new Wrapper(); - assert( p_wrapper ); - - // read wrapper's data file - if( !p_wrapper->readDataFile() ) - return 1; - - // read environment variables - if( !p_wrapper->readEnvironmentVars() ) - return 1; - - // parse command line - if( !p_wrapper->parseCommandLine( argc, argv ) ) - return 1; - - // start compiling/linking - rc = p_wrapper->run(); - - delete p_wrapper; - return rc; -} - - -//////////////////// class Wrapper //////////////////// - -// public methods +// types, enumerations, and structures // -Wrapper::Wrapper() +// +// languages types +// +typedef enum { - m_pConfig = new Config(); - assert( m_pConfig ); -} + LANG_CC, // C + LANG_CXX, // C++ + LANG_F77, // Fortran 77 + LANG_F90 // Fortran 90 +} LangTypeT; -Wrapper::~Wrapper() +// +// instrumentation types +// +typedef enum { - delete m_pConfig; + INST_TYPE_COMPINST = 0x1, // auto. instr. by compiler + INST_TYPE_MANUAL = 0x2, // manual instr. by VT API + INST_TYPE_DYNINST = 0x4, // binary instrumentation by Dyninst + INST_TYPE_TAUINST = 0x8 // auto. source code instr. by TAU +} InstTypeT; + +// +// flags for the "showme" mode +// +enum +{ + SHOWME_FLAG_ALL = 0x1, // show all commands that would be executed + SHOWME_FLAG_COMPILE = 0x2, // show the compiler flags + SHOWME_FLAG_LINK = 0x4 // show the linker flags +}; + +// +// data structure to store wrapper configuration +// +struct ConfigS +{ + ConfigS() + : lang_type( LANG_CC ), inst_type( INST_TYPE_MANUAL ), inst_avail( 0 ), + showme_flags( 0 ), be_verbose( false ), comp_only( false ), + outfile_given( false ), uses_mpi( false ), uses_threads( false ), + uses_openmp( false ), opari_keep_rcfile( false ) + { + opari_rcfile = "opari.rc"; + opari_tabfile = + std::make_pair( std::string( "opari.tab.c" ), + std::string( "opari.tab.o" ) ); + } + + // set language type + inline bool setLanguage( const LangTypeT lang ); + + // language type is set to Fortran? + inline bool fortran() const; + + // set compiler command + inline void setCompilerCmd( const std::string& cmd ); + + // add compiler argument + inline void addCompilerArg( const std::string& arg ); + + // add library to link + inline void addCompilerLib( const std::string& lib ); + + // add source file to be modified by OPARI and/or TAU + inline void addModSrcFile( const std::string& file ); + + // set OPARI table file + inline void setOpariTabFile( const std::string& file ); + + // set OPARI rc file + inline void setOpariRcFile( const std::string& file ); + + // add OPARI argument + inline void addOpariArg( const std::string& arg ); + + // add TAU instumentor argument + inline void addTauinstArg( const std::string& arg ); + + // add TAU parser argument + inline void addTauinstParseArg( const std::string& arg ); + + // set flag for MPI usage + inline void setUsesMpi( const bool set, const bool ovwrt = false ); + + // set flag for Thread usage + inline void setUsesThreads( const bool set, const bool ovwrt = false ); + + // set flag for OpenMP usage + inline void setUsesOpenMP( const bool set, const bool ovwrt = false ); + + // set available instrumentation type + inline bool setInstAvail( const std::string& type ); + + // set instrumentation type + // + inline bool setInstType( const InstTypeT type ); + inline bool setInstType( const std::string& type ); + + // instrumentation type is available? + inline bool isInstAvail( const InstTypeT type ) const; + + LangTypeT lang_type; // language type + InstTypeT inst_type; // instrumentation type + // (e.g. compinst, manual, ...) + + int inst_avail; // bitmask for available instr.-types + int showme_flags; // bitmask for showme flags + bool be_verbose; // Flag: be verbose? + bool comp_only; // Flag: compile only? + bool outfile_given; // Flag: output file given? + bool uses_mpi; // Flag: uses MPI? + bool uses_threads; // Flag: uses Threads? + bool uses_openmp; // Flag: uses OpenMP? (use OPARI) + + std::string vt_version; // VT version + + std::string vt_incdir; // VT's include directory + std::string vt_libdir; // VT's library directory + + std::string vt_seqlib; // VT-library for sequential programs + std::string vt_mpilib; // VT-library for MPI programs + std::string vt_mtlib; // VT-library for multithreading programs + std::string vt_hyblib; // VT-library for hybrid (MPI/Threads) + // programs + std::string vt_pomplib; // VT's POMP library + std::string vt_dynattlib; // VT's Dyninst attach library + + std::string comp_cmdenv; // compiler command env. name + std::string comp_flagsenv; // compiler flags env. name + std::string comp_cmd; // compiler command + std::string comp_args; // compiler arguments + std::string comp_flags; // compiler flags + std::string comp_ldflags; // linker flags + std::string comp_fdflag; // flag to define preprocessor macro + std::string comp_instflags; // compiler instrumentation flags + std::string comp_libs; // libraries to link + + std::string opari_cmd; // OPARI command + std::string opari_args; // OPARI arguments + std::string opari_rcfile; // OPARI's rc file + std::pair + opari_tabfile; // OPARI's table source/object file + std::string opari_tab_compcmd; // compiler command for OPARI's table file + std::string opari_tab_compflags; // compiler flags for OPARI's table file + bool opari_keep_rcfile; // Flag: don't delete OPARI's rc file? + + std::string compinst_flags; // compiler flags to enable instrumentation + std::string dyninst_flags; // compiler flags to produce debugging + // information (needed for binary inst.) + + std::string tauinst_cmd; // TAU instrumentor command + std::string tauinst_args; // TAU instrumentor arguments + std::string tauinst_parsecmd; // PDT source code parser command + std::string tauinst_parseargs; // PDT parser arguments + + std::vector > + mod_files; // source/object files to be modified by + // OPARI and/or TAU + +}; + +// function declarations +// + +// read wrapper's data file +bool readDataFile( void ); + +// read environment variables +bool readEnvironmentVars( void ); + +// parse command line parameters +bool parseCommandLine( int argc, char** argv ); + +// wrap compiler command +int doWrap( void ); + +// show compiler/linker flags +void showFlags( void ); + +// show usage text +void showUsage( void ); + +// show or execute command +int showOrExecuteCommand( std::string& cmd ); + +// get OPARI generated include files from table file +// (only necessary for Fortran) +void getIncFilesFromTabFile( std::vector& incfiles ); + +// remove leading, trailing, and double spaces from a string +inline void trimString( std::string& str ); + +// global variables +// + +// name of program's executable +char* ExeName; + +// wrapper configuration +ConfigS Config; + +int +main( int argc, char** argv ) +{ + int rc = 0; + + // get name of program's executable + // + if( ( ExeName = strrchr( argv[0], '/' ) ) ) + ExeName++; + else + ExeName = argv[0]; + + // read wrapper's data file + // + if( !readDataFile() ) + return 1; + + // read environment variables + // + if( !readEnvironmentVars() ) + return 1; + + // parse command line parameters + // + if( !parseCommandLine( argc, argv ) ) + return 1; + + // either wrap compiler command or show compiler/linker flags + // + if( Config.showme_flags == 0 || Config.showme_flags == SHOWME_FLAG_ALL ) + { + rc = doWrap(); + } + else + { + showFlags(); + } + + return rc; } bool -Wrapper::readDataFile() +readDataFile() { - bool error = false; + bool error = false; - const std::string data_file = - std::string(vt_installdirs_get(VT_INSTALLDIR_DATADIR)) + "/" + - std::string(ExeName) + "-wrapper-data.txt"; + const std::string data_file = + std::string( vt_installdirs_get( VT_INSTALLDIR_DATADIR ) ) + "/" + + std::string( ExeName ) + "-wrapper-data.txt"; - const uint32_t keys_num = 29; - const std::string keys[] = { - "version", "language", "compiler_env", "compiler_flags_env", - "compiler", "compiler_flags", "linker_flags", "libs", "includedir", - "libdir", "vtlib", "vtmpilib", "vtmtlib", "vthyblib", "vtpomplib", - "vtdynattlib", "opari_bin", "opari_opts", "opari_tab_compiler", - "opari_tab_compiler_flags", "compinst_compiler_flags", - "dyninst_compiler_flags", "tauinst_bin", "tauinst_opts", - "tauinst_parse_bin", "tauinst_parse_opts", - "inst_avail", "inst_default", "partype_default" - }; + const uint32_t keys_num = 29; + const std::string keys[] = { + "version", "language", "compiler_env", "compiler_flags_env", + "compiler", "compiler_flags", "linker_flags", "libs", "includedir", + "libdir", "vtlib", "vtmpilib", "vtmtlib", "vthyblib", "vtpomplib", + "vtdynattlib", "opari_bin", "opari_opts", "opari_tab_compiler", + "opari_tab_compiler_flags", "compinst_compiler_flags", + "dyninst_compiler_flags", "tauinst_bin", "tauinst_opts", + "tauinst_parse_bin", "tauinst_parse_opts", + "inst_avail", "inst_default", "partype_default" + }; - std::ifstream in( data_file.c_str() ); - if( !in ) - { - std::cerr << ExeName << ": error: could not open configuration file " - << data_file << std::endl; - return false; - } + std::ifstream in( data_file.c_str() ); + if( !in ) + { + std::cerr << ExeName << ": Error: Could not open configuration file " + << data_file << ". Aborting." << std::endl; + return false; + } - char buffer[1024]; - std::string line; - uint32_t line_no = 0; - uint32_t key_idx = 0; + char buffer[1024]; + std::string line; + uint32_t line_no = 0; + uint32_t key_idx = 0; - while( key_idx < keys_num - && in.getline( buffer, sizeof( buffer ) ) ) - { - line_no++; + while( !error && key_idx < keys_num && + in.getline( buffer, sizeof( buffer ) ) ) + { + line_no++; - if( buffer[0] == '#' || buffer[0] == '\n' || buffer[0] == '\0' ) - continue; - if( buffer[strlen(buffer)-1] == '\n' ) - buffer[strlen(buffer)-1] = '\0'; + if( buffer[0] == '#' || buffer[0] == '\n' || buffer[0] == '\0' ) + continue; + if( buffer[strlen(buffer)-1] == '\n' ) + buffer[strlen(buffer)-1] = '\0'; - line = buffer; + line = buffer; - std::string::size_type valpos = line.find( "=" ); - std::string key; - std::string value; + std::string::size_type valpos = line.find( '=' ); + std::string key; + std::string value; - if( valpos == std::string::npos || valpos < 1 ) - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "could not be parsed" << std::endl; - error = true; - break; - } - - key = line.substr( 0, valpos ); - value = line.substr( valpos+1 ); - - if( key.compare( keys[key_idx++] ) != 0 ) - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "unexpected key '" - << key << "'" << std::endl; - error = true; - break; - } - - // expand install directories from value except keys 1-4 - // - if( key_idx > 4 ) - { - char* tmp = vt_installdirs_expand( value.c_str() ); - if( !tmp ) - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "could not be parsed" << std::endl; - error = true; - break; - } - - value = tmp; - free( tmp ); - } - - switch( key_idx ) - { - case 1: // version - { - m_pConfig->m_sVT_Version = value; - break; - } - case 2: // language - { - if( value.compare( "C" ) == 0 ) - error = !m_pConfig->setLanguage( LANG_CC ); - else if( value.compare( "C++" ) == 0 ) - error = !m_pConfig->setLanguage( LANG_CXX ); - else if( value.compare( "Fortran 77" ) == 0 ) - error = !m_pConfig->setLanguage( LANG_F77 ); - else if( value.compare( "Fortran 90" ) == 0 ) - error = !m_pConfig->setLanguage( LANG_F90 ); - else - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "unknown language '" << value << "'" << std::endl; - error = true; - } - break; - } - case 3: // compiler_env - { - m_pConfig->m_sComp_CmdEnv = value; - break; - } - case 4: // compiler_flags_env - { - m_pConfig->m_sComp_FlagsEnv = value; - break; - } - case 5: // compiler - { - m_pConfig->compiler_setCmd( value ); - break; - } - case 6: // compiler_flags - { - m_pConfig->m_sComp_Flags = value; - break; - } - case 7: // linker flags - { - m_pConfig->m_sComp_LdFlags = value; - break; - } - case 8: // libs - { - m_pConfig->m_sComp_Libs = value; - break; - } - case 9: // includedir - { - m_pConfig->m_sVT_IncDir = "-I" + value; - break; - } - case 10: // libdir - { - m_pConfig->m_sVT_LibDir = "-L" + value; - break; - } - case 11: // vtlib - { - m_pConfig->m_sVT_SeqLib = value; - break; - } - case 12: // vtmpilib - { - m_pConfig->m_sVT_MpiLib = value; - break; - } - case 13: // vtmtlib - { - m_pConfig->m_sVT_MtLib = value; - break; - } - case 14: // vthyblib - { - m_pConfig->m_sVT_HybLib = value; - break; - } - case 15: // vtpomplib - { - m_pConfig->m_sVT_PompLib = value; - break; - } - case 16: // vtdynattlib - { - m_pConfig->m_sVT_DynAttLib = value; - break; - } - case 17: // opari_bin - { - m_pConfig->m_sOpari_Cmd = value; - break; - } - case 18: // opari_opts - { - m_pConfig->m_sOpari_Args = value; - break; - } - case 19: // opari_tab_compiler - { - m_pConfig->m_sOpari_TabCompCmd = value; - break; - } - case 20: // opari_tab_compiler_flags - { - m_pConfig->m_sOpari_TabCompFlags = value; - break; - } - case 21: // compinst_compiler_flags - { - m_pConfig->m_sCompInst_Flags = value; - break; - } - case 22: // dyninst_compiler_flags - { - m_pConfig->m_sDynInst_Flags = value; - break; - } - case 23: // tauinst_bin - { - m_pConfig->m_sTauInst_Cmd = value; - break; - } - case 24: // tauinst_opts - { - m_pConfig->m_sTauInst_Args = value; - break; - } - case 25: // tauinst_parse_bin - { - m_pConfig->m_sTauInst_ParseCmd = value; - break; - } - case 26: // tauinst_parse_opts - { - m_pConfig->m_sTauInst_ParseArgs = value; - break; - } - case 27: // inst_avail - { - char cvalue[128]; - strncpy( cvalue, value.c_str(), sizeof( cvalue ) - 1 ); - cvalue[sizeof(cvalue) - 1] = '\0'; - - char * token = strtok( cvalue, " " ); - if( !token ) - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "could not be parsed" << std::endl; - error = true; - break; - } - - do - { - if( !m_pConfig->setInstAvail( token ) ) - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "unknown instrumentation type '" - << token << "'" << std::endl; - error = true; - break; - } - } while( ( token = strtok( 0, " " ) ) ); - - break; - } - case 28: // inst_default - { - if( !m_pConfig->setInstType( value ) ) - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "unknown or not supported instrumentation type '" - << value << "'" << std::endl; - error = true; - } - break; - } - case 29: // partype_default - { - if( value.compare( "seq" ) == 0 ) - { - } - else if( value.compare( "mpi" ) == 0 ) - { - m_pConfig->setUsesMpi( true ); - } - else if( value.compare( "mt" ) == 0 ) - { - m_pConfig->setUsesThreads( true ); - } - else if( value.compare( "hyb" ) == 0 ) - { - m_pConfig->setUsesMpi( true ); - m_pConfig->setUsesThreads( true ); - } - else - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "unknown parallelization type '" - << value << "'" << std::endl; - error = true; - } - break; - } - default: - { - std::cerr << ExeName << ": " - << data_file << ":" << line_no << ": " - << "could not be parsed" << std::endl; - error = true; - break; - } - } - - if( error ) break; - } - - in.close(); - - if( !error && key_idx < keys_num ) - { + if( valpos == std::string::npos || valpos < 1 ) + { std::cerr << ExeName << ": " - << data_file << ": " - << "unexpected end of file" << std::endl; - return false; - } + << data_file << ":" << line_no << ": " + << "could not be parsed" << std::endl; + error = true; + break; + } - return !error; -} + key = line.substr( 0, valpos ); + value = line.substr( valpos + 1 ); -bool -Wrapper::readEnvironmentVars() -{ - char * env; + if( key.compare( keys[key_idx++] ) != 0 ) + { + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "unexpected key '" + << key << "'" << std::endl; + error = true; + break; + } - // read environment var. for compiler command - // (VT_) - // - env = getenv( m_pConfig->m_sComp_CmdEnv.c_str() ); - if( env ) m_pConfig->compiler_setCmd( env ); - - // read environment var. for extra compiler flags - // (VT_FLAGS) - env = getenv( m_pConfig->m_sComp_FlagsEnv.c_str() ); - if( env ) - { - if( m_pConfig->m_sComp_Flags.length() > 0 ) - m_pConfig->m_sComp_Flags += " "; - m_pConfig->m_sComp_Flags += env; - } - - // read environment var. for extra linker flags - // (VT_LDFLAGS) - env = getenv( "VT_LDFLAGS" ); - if( env ) m_pConfig->m_sComp_LdFlags = env; - - // read environment var. for extra libs - // (VT_LIBS) - env = getenv( "VT_LIBS" ); - if( env ) - { - if( m_pConfig->m_sComp_Libs.length() > 0 ) - m_pConfig->m_sComp_Libs += " "; - m_pConfig->m_sComp_Libs += env; - } - - // read environment var. for instrumentation type - // (VT_INST) - // - env = getenv( "VT_INST" ); - if( env ) - { - if( !m_pConfig->setInstType( env ) ) + // expand install directories from value except keys 1-4 + // + if( key_idx > 4 ) + { + char* tmp = vt_installdirs_expand( value.c_str() ); + if( !tmp ) { - std::cerr << ExeName << ": error: VT_INST: " - << "unknown or not supported instrumentation type '" - << env << "'" << std::endl; - return false; - } - } - - return true; -} - -bool -Wrapper::parseCommandLine( int argc, char ** argv ) -{ - std::vector args; - std::string arg; - uint32_t i; - - // pre-process arguments - // - for( i = 1; i < (uint32_t)argc; i++ ) - { - arg = argv[i]; - - // we also accept "--vt:" - modify "--vt:" to "-vt:" - // - if( arg.compare(0,5,"--vt:") == 0 ) - { - arg.erase(0,1); + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "could not be parsed" << std::endl; + error = true; + break; } - // merge separated compiler arguments - // - - // ^ - if( arg.compare( "-I" ) == 0 - || arg.compare( "-D" ) == 0 - || arg.compare( "-L" ) == 0 - || arg.compare( "-l" ) == 0 ) - { - if( i < (uint32_t)argc - 1 ) - arg += argv[++i]; - } + value = tmp; + free( tmp ); + } - args.push_back( arg ); - } - - for( i = 0; i < args.size(); i++ ) - { - arg = args[i]; - - // - // -vt:help - // - if( arg.compare("-vt:help") == 0 ) + switch( key_idx ) + { + case 1: // version { - showUsageText(); - exit(0); + Config.vt_version = value; + break; } - // - // -vt:version - // - if( arg.compare("-vt:version") == 0 ) + case 2: // language { - showVersion(); - exit(0); + if( value.compare( "C" ) == 0 ) + error = !Config.setLanguage( LANG_CC ); + else if( value.compare( "C++" ) == 0 ) + error = !Config.setLanguage( LANG_CXX ); + else if( value.compare( "Fortran 77" ) == 0 ) + error = !Config.setLanguage( LANG_F77 ); + else if( value.compare( "Fortran 90" ) == 0 ) + error = !Config.setLanguage( LANG_F90 ); + else + { + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "unknown language '" << value << "'" << std::endl; + error = true; + } + break; } - // - // -vt:show - // - else if( arg.compare("-vt:show") == 0 ) + case 3: // compiler_env { - m_pConfig->m_bShow = true; + Config.comp_cmdenv = value; + break; } - // - // -vt:verbose - // - else if( arg.compare("-vt:verbose") == 0 ) + case 4: // compiler_flags_env { - m_pConfig->m_bBeVerbose = true; + Config.comp_flagsenv = value; + break; } - // - // -vt:inst - // - else if( arg.compare("-vt:inst") == 0 ) + case 5: // compiler { - if( i == args.size() - 1 ) - { - std::cerr << ExeName << ": expected -- -vt:inst" - << std::endl; - return false; - } + Config.setCompilerCmd( value ); + break; + } + case 6: // compiler_flags + { + Config.comp_flags = value; + break; + } + case 7: // linker flags + { + Config.comp_ldflags = value; + break; + } + case 8: // libs + { + Config.comp_libs = value; + break; + } + case 9: // includedir + { + Config.vt_incdir = "-I" + value; + break; + } + case 10: // libdir + { + Config.vt_libdir = "-L" + value; + break; + } + case 11: // vtlib + { + Config.vt_seqlib = value; + break; + } + case 12: // vtmpilib + { + Config.vt_mpilib = value; + break; + } + case 13: // vtmtlib + { + Config.vt_mtlib = value; + break; + } + case 14: // vthyblib + { + Config.vt_hyblib = value; + break; + } + case 15: // vtpomplib + { + Config.vt_pomplib = value; + break; + } + case 16: // vtdynattlib + { + Config.vt_dynattlib = value; + break; + } + case 17: // opari_bin + { + Config.opari_cmd = value; + break; + } + case 18: // opari_opts + { + Config.opari_args = value; + break; + } + case 19: // opari_tab_compiler + { + Config.opari_tab_compcmd = value; + break; + } + case 20: // opari_tab_compiler_flags + { + Config.opari_tab_compflags = value; + break; + } + case 21: // compinst_compiler_flags + { + Config.compinst_flags = value; + break; + } + case 22: // dyninst_compiler_flags + { + Config.dyninst_flags = value; + break; + } + case 23: // tauinst_bin + { + Config.tauinst_cmd = value; + break; + } + case 24: // tauinst_opts + { + Config.tauinst_args = value; + break; + } + case 25: // tauinst_parse_bin + { + Config.tauinst_parsecmd = value; + break; + } + case 26: // tauinst_parse_opts + { + Config.tauinst_parseargs = value; + break; + } + case 27: // inst_avail + { + char cvalue[128]; + strncpy( cvalue, value.c_str(), sizeof( cvalue ) - 1 ); + cvalue[sizeof( cvalue ) - 1] = '\0'; - arg = args[++i]; + char* token = strtok( cvalue, " " ); + if( !token ) + { + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "could not be parsed" << std::endl; + error = true; + break; + } - if( !m_pConfig->setInstType( arg ) ) - { + do + { + if( !Config.setInstAvail( token ) ) + { std::cerr << ExeName << ": " - << "unknown or not supported instrumentation type '" - << arg << "'" << std::endl; - return false; - } + << data_file << ":" << line_no << ": " + << "unknown instrumentation type '" + << token << "'" << std::endl; + error = true; + break; + } + } while( ( token = strtok( 0, " " ) ) ); + + break; } - // - // -vt:opari - // - else if( arg.compare("-vt:opari") == 0 ) + case 28: // inst_default { - if( i == args.size() - 1 ) - { - std::cerr << ExeName << ": expected -- -vt:opari" - << std::endl; - return false; - } - - size_t opari_args_len = args[i+1].length()+1; - char * opari_args = new char[opari_args_len]; - strncpy( opari_args, args[++i].c_str(), opari_args_len - 1 ); - opari_args[opari_args_len - 1] = '\0'; - - char * token = strtok( opari_args, " " ); - do - { - if( strcmp( token, "-rcfile" ) == 0 ) - { - token = strtok( 0, " " ); - if( !token ) - { - std::cerr << ExeName << ": expected -- -rcfile" - << std::endl; - delete [] opari_args; - return false; - } - m_pConfig->opari_setRcFile( token ); - } - else if( strcmp( token, "-table" ) == 0 ) - { - token = strtok( 0, " " ); - if( !token ) - { - std::cerr << ExeName << ": expected -- -table" - << std::endl; - delete [] opari_args; - return false; - } - - m_pConfig->opari_setTabFile( token ); - } - else - { - m_pConfig->opari_addArg( token ); - } - } while( ( token = strtok( 0, " " ) ) ); - - delete [] opari_args; + if( !Config.setInstType( value ) ) + { + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "unknown or not supported instrumentation type '" + << value << "'" << std::endl; + error = true; + } + break; } - // - // -vt:noopari - // - else if( arg.compare("-vt:noopari") == 0 ) + case 29: // partype_default { - m_pConfig->setUsesOpenMP( false, true ); + if( value.compare( "seq" ) == 0 ) + { + } + else if( value.compare( "mpi" ) == 0 ) + { + Config.setUsesMpi( true ); + } + else if( value.compare( "mt" ) == 0 ) + { + Config.setUsesThreads( true ); + } + else if( value.compare( "hyb" ) == 0 ) + { + Config.setUsesMpi( true ); + Config.setUsesThreads( true ); + } + else + { + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "unknown parallelization type '" + << value << "'" << std::endl; + error = true; + } + break; } - // - // -vt:tau - // - else if( arg.compare("-vt:tau") == 0 ) + default: { - if( i == args.size() - 1 ) - { - std::cerr << ExeName << ": expected -- -vt:tau" - << std::endl; - return false; - } - - m_pConfig->tauinst_addArg( args[++i] ); + std::cerr << ExeName << ": " + << data_file << ":" << line_no << ": " + << "could not be parsed" << std::endl; + error = true; + break; } - // - // -vt:pdt - // - else if( arg.compare("-vt:pdt") == 0 ) - { - if( i == args.size() - 1 ) - { - std::cerr << ExeName << ": expected -- -vt:pdt" - << std::endl; - return false; - } + } + } - m_pConfig->tauinst_addParseArg( args[++i] ); - } - // - // -vt:seq - // - else if( arg.compare("-vt:seq") == 0 ) - { - m_pConfig->setUsesMpi( false, true ); - m_pConfig->setUsesThreads( false, true ); - m_pConfig->setUsesOpenMP( false, true ); - } - // - // -vt:mpi - // - else if( arg.compare("-vt:mpi") == 0 ) - { - m_pConfig->setUsesMpi( true, true ); - m_pConfig->setUsesThreads( false, true ); - m_pConfig->setUsesOpenMP( false, true ); - } - // - // -vt:mt - // - else if( arg.compare("-vt:mt") == 0 ) - { - m_pConfig->setUsesMpi( false, true ); - m_pConfig->setUsesThreads( true, true ); - } - // - // -vt:hyb - // - else if( arg.compare("-vt:hyb") == 0 ) - { - m_pConfig->setUsesMpi( true, true ); - m_pConfig->setUsesThreads( true, true ); - } - // - // pthread flags/libs - // - else if( arg.compare( "-Kthread" ) == 0 - || arg.compare( "-kthread" ) == 0 - || arg.compare( "-pthread" ) == 0 - || arg.compare( "-pthreads" ) == 0 - || arg.compare( "-mthreads" ) == 0 - || arg.compare( "--thread-safe" ) == 0 - || arg.compare( "-lpthreads" ) == 0 - || arg.compare( "-llthread" ) == 0 - || arg.compare( "-lpthread" ) == 0 ) - { - m_pConfig->setUsesThreads( true ); - } - // - // openmp flag - // - else if( arg.compare( "-openmp" ) == 0 - || arg.compare( "-fopenmp" ) == 0 - || arg.compare( "-Popenmp" ) == 0 - || arg.compare( "-xopenmp" ) == 0 - || arg.compare( "-mp" ) == 0 ) - { - m_pConfig->setUsesThreads( true ); - m_pConfig->setUsesOpenMP( true ); - } - else if( arg.length() > 6 && arg.compare( 0, 6, "-qsmp=" ) == 0 ) - { - char carg[128]; - strncpy( carg, arg.substr(6).c_str(), sizeof( carg ) - 1 ); - carg[sizeof(carg) - 1] = '\0'; + in.close(); - char * token = strtok( carg, ":" ); - do - { - if( strcmp( token, "omp" ) == 0 ) - { - m_pConfig->setUsesThreads( true ); - m_pConfig->setUsesOpenMP( true ); - break; - } - } while( ( token = strtok( 0, ":" ) ) ); - } - // - // nvcc's pthread/openmp flag - // - else if( arg.compare( 0, 10, "-Xcompiler" ) == 0 - || arg.compare( 0, 18, "--compiler-options" ) == 0 - || arg.compare( 0, 8, "-Xlinker" ) == 0 - || arg.compare( 0, 16, "--linker-options" ) == 0 ) - { - if( arg.find( "-pthread" ) != std::string::npos ) - m_pConfig->setUsesThreads( true ); + if( !error && key_idx < keys_num ) + { + std::cerr << ExeName << ": " + << data_file << ": " + << "unexpected end of file" << std::endl; + return false; + } - if( arg.find( "-fopenmp" ) != std::string::npos ) - { - m_pConfig->setUsesThreads( true ); - m_pConfig->setUsesOpenMP( true ); - } - } - } - - bool addlibs = false; - - for( i = 0; i < args.size(); i++ ) - { - arg = args[i]; - - // escape '\', '"', ''', ' ', '(', and ')' - // - const char special_char[] = "\\\"' ()"; - size_t found = arg.find_first_of( special_char ); - while( found!=std::string::npos ) - { - arg.insert(found,"\\"); - found = arg.find_first_of( special_char, found+2 ); - } - - // - // -vt:help, -vt:version, -vt:show, -vt:seq, -vt:mpi, -vt:mt, -vt:hyb, - // -vt:inst, -vt:opari, -vt:tau, -vt:pdt - // (processed above; ignore here) - // - if( arg.compare("-vt:help") == 0 - || arg.compare("-vt:version") == 0 - || arg.compare("-vt:show") == 0 - || arg.compare("-vt:verbose") == 0 - || arg.compare("-vt:seq") == 0 - || arg.compare("-vt:mpi") == 0 - || arg.compare("-vt:mt") == 0 - || arg.compare("-vt:hyb") == 0 - || arg.compare("-vt:inst") == 0 - || arg.compare("-vt:opari") == 0 - || arg.compare("-vt:noopari") == 0 - || arg.compare("-vt:tau") == 0 - || arg.compare("-vt:pdt") == 0 ) - { - // do nothing - - // skip next argument, if necessary - if( arg.compare("-vt:inst") == 0 - || arg.compare("-vt:opari") == 0 - || arg.compare("-vt:tau") == 0 - || arg.compare("-vt:pdt") == 0 ) - i++; - } - // - // -vt: - // - else if( ( m_pConfig->m_eLangType == LANG_CC && arg.compare("-vt:cc") == 0 ) - || ( m_pConfig->m_eLangType == LANG_CXX && - ( arg.compare("-vt:CC") == 0 - || arg.compare("-vt:c++") == 0 - || arg.compare("-vt:cxx") == 0 ) ) - || (m_pConfig->m_eLangType == LANG_F77 && arg.compare("-vt:f77") == 0) - || (m_pConfig->m_eLangType == LANG_F90 && arg.compare("-vt:f90") == 0) ) - { - if( i == args.size() - 1 ) - { - std::cerr << ExeName << ": expected -- " - << arg << std::endl; - return false; - } - - m_pConfig->compiler_setCmd( args[++i] ); - } - // - // -vt:* -> unknown wrapper argument - // - else if( arg.compare( 0, 4, "-vt:" ) == 0 ) - { - std::cerr << ExeName << ": unknown option -- " - << arg << std::endl; - return false; - } - // - // source file - // - else if( ( arg.length() >= 2 - && arg.compare( arg.length() - 2, 2, ".c" ) == 0 ) - || ( arg.length() >= 2 - && arg.compare( arg.length() - 2, 2, ".C" ) == 0 ) - || ( arg.length() >= 3 - && arg.compare( arg.length() - 3, 3, ".cc" ) == 0 ) - || ( arg.length() >= 3 - && arg.compare( arg.length() - 3, 3, ".CC" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".cpp" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".CPP" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".cxx" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".CXX" ) == 0 ) - || ( arg.length() >= 2 - && arg.compare( arg.length() - 2, 2, ".f" ) == 0 ) - || ( arg.length() >= 2 - && arg.compare( arg.length() - 2, 2, ".F" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".f77" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".F77" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".f90" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".F90" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".f95" ) == 0 ) - || ( arg.length() >= 4 - && arg.compare( arg.length() - 4, 4, ".F95" ) == 0 ) - || ( arg.length() >= 3 - && arg.compare( arg.length() - 3, 3, ".cu" ) == 0 ) ) - { - m_pConfig->compiler_addSrcFile( arg ); - } - // - // -* - // - else if( arg.compare( 0, 2, "-I" ) == 0 - || arg.compare( 0, 2, "-D" ) == 0 ) - { - if( m_pConfig->m_eInstType == INST_TYPE_TAUINST ) - m_pConfig->tauinst_addParseArg( arg ); - m_pConfig->compiler_addArg( arg ); - } - // - // -WF,-D* - // - else if( ( m_pConfig->m_eLangType == LANG_F77 - || m_pConfig->m_eLangType == LANG_F90 ) - && arg.compare( 0, 6, "-WF,-D" ) == 0 ) - { - if( m_pConfig->m_eInstType == INST_TYPE_TAUINST ) - m_pConfig->tauinst_addParseArg( arg.substr(4) ); - m_pConfig->compiler_addArg( arg ); - } - // - // Fortran line length flag - // - else if( ( m_pConfig->m_eLangType == LANG_F77 - || m_pConfig->m_eLangType == LANG_F90 ) - && ( arg.compare( "-ffixed-line-length-132" ) == 0 - || arg.compare( "-extend_source" ) == 0 - || arg.compare( "-Mextend" ) == 0 - || arg.compare( "-e" ) == 0 - || arg.compare( "-qfixed=132" ) == 0 ) ) - { - if( m_pConfig->m_eInstType == INST_TYPE_TAUINST ) - m_pConfig->tauinst_addParseArg( "-ffixed-line-length-132" ); - m_pConfig->compiler_addArg( arg ); - } - // - // Fortran free format flag - // - else if( ( m_pConfig->m_eLangType == LANG_F77 - || m_pConfig->m_eLangType == LANG_F90 ) - && ( arg.compare( "-ffree-form" ) == 0 - || arg.compare( "-free" ) == 0 - || arg.compare( "-Mfree" ) == 0 - || arg.compare( 0, 6, "-qfree" ) == 0 ) ) - { - if( m_pConfig->m_eInstType == INST_TYPE_TAUINST - && m_pConfig->m_sTauInst_ParseCmd.compare( "f95parse" ) == 0 ) - m_pConfig->tauinst_addParseArg( "-R free" ); - m_pConfig->compiler_addArg( arg ); - } - // - // Fortran fixed format flag - // - else if( ( m_pConfig->m_eLangType == LANG_F77 - || m_pConfig->m_eLangType == LANG_F90 ) - && ( arg.compare( "-ffixed-form" ) == 0 - || arg.compare( "-fixed" ) == 0 - || arg.compare( "-Mfixed" ) == 0 - || arg.compare( 0, 7, "-qfixed" ) == 0 ) ) - { - if( m_pConfig->m_eInstType == INST_TYPE_TAUINST - && m_pConfig->m_sTauInst_ParseCmd.compare( "f95parse" ) == 0 ) - m_pConfig->tauinst_addParseArg( "-R fixed" ); - m_pConfig->compiler_addArg( arg ); - } - // - // -c - // - else if( arg.compare( "-c" ) == 0 ) - { - m_pConfig->m_bCompOnly = true; - m_pConfig->compiler_addArg( arg ); - } - // - // -o - // - else if( arg.compare( "-o" ) == 0 ) - { - m_pConfig->m_bOutfileGiven = true; - m_pConfig->compiler_addArg( arg ); - } - // - // -lcuda[rt] - // - else if( arg.compare( "-lcuda" ) == 0 - || arg.compare( "-lcudart" ) == 0 ) - { - m_pConfig->compiler_addLib( arg ); - } - // - // -l - // - else if( arg.compare( 0, 5, "-lmpi" ) == 0 - || arg.compare( 0, 7, "-lmtmpi" ) == 0 - || arg.compare( 0, 7, "-lhpmpi" ) == 0 - || arg.compare( 0, 7, "-lscmpi" ) == 0 ) - { - m_pConfig->setUsesMpi( true ); - m_pConfig->compiler_addLib( arg ); - addlibs = true; - } - // - // -* - // - else if( arg.compare( 0, 2, "-L" ) == 0 - || arg.compare( 0, 2, "-l" ) == 0 ) - { - if( addlibs ) - m_pConfig->compiler_addLib( arg ); - else - m_pConfig->compiler_addArg( arg ); - } - // - // unknown argument - // - else - { - m_pConfig->compiler_addArg( arg ); - } - } - - return true; -} - -int -Wrapper::run() -{ - std::string cmd; - int rc = 0; - - uint32_t i; - - // get frequently used members from config class for easier access - // - LangTypeT lang_type = m_pConfig->m_eLangType; - InstTypeT inst_type = m_pConfig->m_eInstType; - bool uses_mpi = m_pConfig->m_bUsesMpi; - bool uses_threads = m_pConfig->m_bUsesThreads; - bool uses_openmp = m_pConfig->m_bUsesOpenMP; - bool beverbose = m_pConfig->m_bBeVerbose; - bool show = m_pConfig->m_bShow; - - // vector which holds all intermediately created files - std::vector files_to_remove; - - // map which holds all object files created by the compiler - // which must be renamed to original file names - std::map obj_files_to_rename; - - // call compiler without any parameters, if - // insufficient arguments given - // - if( !show - && m_pConfig->m_sComp_Args.length() == 0 - && m_pConfig->m_vecComp_SrcFiles.size() == 0 ) - { - rc = system( m_pConfig->m_sComp_Cmd.c_str() ); - return WEXITSTATUS( rc ); - } - - // process collected source files by OPARI and/or TAU - // - for( i = 0; i < m_pConfig->m_vecComp_SrcFiles.size(); i++ ) - { - std::string src_file = m_pConfig->m_vecComp_SrcFiles[i]; - - std::string::size_type si; - - // run OPARI command on source file - // - if( uses_openmp ) - { - // build OPARI command - // - cmd = - m_pConfig->m_sOpari_Cmd + " " - + m_pConfig->m_sOpari_Args + " " - + "-rcfile " - + m_pConfig->m_sOpari_RcFile + " " - + "-table " - + m_pConfig->m_sOpari_TabFile.first + " " - + src_file; - - // execute/show OPARI command - // - if( ( rc = executeOrShowCommand( cmd ) ) != 0 ) - return rc; - - // create OPARI modified source file name - // - - std::string mod_file = src_file; - si = mod_file.rfind( '.' ); - assert( si != std::string::npos ); - mod_file.insert( si, ".mod" ); - - // convert Fortran source file suffix to upper case, in order to - // invoke the C preprocessor before compiling - // - if( lang_type == LANG_F77 || lang_type == LANG_F90 ) - { - si = mod_file.rfind( ".f" ); - if( si != std::string::npos ) mod_file.replace( si, 2, ".F" ); - } - - files_to_remove.push_back( mod_file ); - - // create OPARI include file name - // - if( lang_type == LANG_CC || lang_type == LANG_CXX ) - { - std::string inc_file = src_file + ".opari.inc"; - files_to_remove.push_back( inc_file ); - } - - src_file = mod_file; - } - - // run PDT parser and TAU instrumentor command on source file - // - if( inst_type == INST_TYPE_TAUINST ) - { - // adjust PDT parser options, if source file is instrumented by OPARI - // - if( uses_openmp ) - { - // current directory to find OPARI generated header files - // (only necessary for C/C++) - // - if( lang_type == LANG_CC || lang_type == LANG_CXX ) - m_pConfig->tauinst_addParseArg( "-I." ); - - // macro definition '_OPENMP' - // (the PDT parser has no own option to enable OpenMP) - m_pConfig->tauinst_addParseArg( "-D_OPENMP" ); - } - - // build PDT parse command - // - cmd = - m_pConfig->m_sTauInst_ParseCmd + " " - + src_file + " " - + m_pConfig->m_sVT_IncDir + " " - + m_pConfig->m_sTauInst_ParseArgs; - - // execute/show PDT parse command - // - if( ( rc = executeOrShowCommand( cmd ) ) != 0 ) - return rc; - - // create PDB file name - // - - std::string pdb_file = src_file; - si = src_file.rfind( '/' ); - if( si != std::string::npos ) - pdb_file = src_file.substr( si+1 ); - - si = pdb_file.rfind( '.' ); - assert( si != std::string::npos ); - pdb_file.replace( si, 4, ".pdb" ); - - files_to_remove.push_back( pdb_file ); - - // create TAU modified source file name - // - std::string tau_file = src_file; - if( uses_openmp ) - { - si = tau_file.rfind( ".mod" ); - assert( si != std::string::npos ); - tau_file.replace( si, 4, ".tau" ); - } - else - { - si = tau_file.rfind( '.' ); - assert( si != std::string::npos ); - tau_file.insert( si, ".tau" ); - - // convert Fortran source file suffix to upper case, in order to - // invoke the C preprocessor before compiling - // - if( lang_type == LANG_F77 || lang_type == LANG_F90 ) - { - si = tau_file.rfind( ".f" ); - if( si != std::string::npos ) tau_file.replace( si, 2, ".F" ); - } - } - files_to_remove.push_back( tau_file ); - - // build TAU instrumentor command - // - cmd = - m_pConfig->m_sTauInst_Cmd + " " - + pdb_file + " " - + src_file + " " - + "-o " - + tau_file + " " - + m_pConfig->m_sTauInst_Args; - - // execute/show TAU instrumentor command - // - if( ( rc = executeOrShowCommand( cmd ) ) != 0 ) - return rc; - - src_file = tau_file; - } - - // create and store compiler output file name for renaming, if it's not - // specified by the command line - // - if( m_pConfig->m_bCompOnly && !m_pConfig->m_bOutfileGiven - && ( uses_openmp || inst_type == INST_TYPE_TAUINST ) ) - { - std::string obj_file = src_file; - - si = src_file.rfind( '/' ); - if( si != std::string::npos ) - obj_file = src_file.substr( si+1 ); - - si = obj_file.rfind( '.' ); - assert( si != std::string::npos ); - obj_file = obj_file.substr( 0, si ) + ".o"; - - obj_files_to_rename[obj_file] = m_pConfig->m_vecComp_ObjFiles[i]; - } - } - - if( uses_openmp ) - { - // add current working directory to include search path to find OPARI - // generated header files (only necessary for C/C++) - // - if( lang_type == LANG_CC || lang_type == LANG_CXX ) - m_pConfig->compiler_addArg( "-I." ); - - // If the source file(s) are instrumented by OPARI *and* TAU, the source - // code locations determined by TAU are nonsense. Add compiler flag to - // disable recording of source code locations. - // - if( inst_type == INST_TYPE_TAUINST ) - { - m_pConfig->compiler_addArg( - m_pConfig->m_sComp_FDFlag + "TAUINST_NOSRC" ); - } - } - - // compile only ? - if( m_pConfig->m_bCompOnly ) - { - // build compiler command - // - cmd = m_pConfig->m_sComp_Cmd + " " - + m_pConfig->m_sVT_IncDir + " " - + m_pConfig->m_sComp_InstFlags + " " - + m_pConfig->m_sComp_Flags + " " - + m_pConfig->m_sComp_Args; - - // execute/show compiler command - // - if( ( rc = executeOrShowCommand( cmd ) ) != 0 ) - return rc; - - // rename compiler output files to original file names - // - if( !show ) - { - for( std::map::iterator it = - obj_files_to_rename.begin(); it != obj_files_to_rename.end(); - it++ ) - { - if( beverbose ) - std::cout << "+++ rename " << it->first - << " to " << it->second << std::endl; - if( rename( it->first.c_str(), it->second.c_str() ) == -1 ) - { - std::cerr << ExeName << ": could not rename " << it->first - << " to " << it->second << std::endl; - return 1; - } - } - } - } - else - { - std::string vtlib; - - if( uses_openmp ) - { - // build command for compiling OPARI table file - // - cmd = - m_pConfig->m_sOpari_TabCompCmd + " " - + m_pConfig->m_sOpari_TabCompFlags + " " - + m_pConfig->m_sVT_IncDir + " " - + ( (lang_type == LANG_F77 || lang_type == LANG_F90) ? "-I. " : "" ) - + "-c " + m_pConfig->m_sOpari_TabFile.first + " " - + "-o " + m_pConfig->m_sOpari_TabFile.second; - - // execute/show compiler command - // - if( ( rc = executeOrShowCommand( cmd ) ) != 0 ) - return rc; - - // add OPARI table object file to to linker arguments - m_pConfig->compiler_addArg( m_pConfig->m_sOpari_TabFile.second ); - - // collect intermediate OPARI output files for removing - // - - // OPARI include files - // - if( lang_type == LANG_F77 || lang_type == LANG_F90 ) - { - std::vector vec_incfiles = getIncFilesFromTabFile(); - for( i = 0; i < vec_incfiles.size(); i++ ) - files_to_remove.push_back( vec_incfiles[i].c_str() ); - } - - // OPARI table source/object file - // - files_to_remove.push_back( m_pConfig->m_sOpari_TabFile.first ); - files_to_remove.push_back( m_pConfig->m_sOpari_TabFile.second ); - - // OPARI rc file - // - if( !m_pConfig->m_bKeepOpariRcFile ) - files_to_remove.push_back( m_pConfig->m_sOpari_RcFile ); - } - - // build compiler command - // - vtlib = ( ( inst_type == INST_TYPE_DYNINST ) ? - m_pConfig->m_sVT_DynAttLib : "" ); - - if( uses_threads ) - { - vtlib += " " - + ( uses_openmp ? - m_pConfig->m_sVT_PompLib : "" ); - - if( uses_mpi ) - vtlib += " " + m_pConfig->m_sVT_HybLib; - else - vtlib += " " + m_pConfig->m_sVT_MtLib; - } - else - { - if( uses_mpi ) - vtlib += " " + m_pConfig->m_sVT_MpiLib; - else - vtlib += " " + m_pConfig->m_sVT_SeqLib; - } - - cmd = - m_pConfig->m_sComp_Cmd + " " - + m_pConfig->m_sVT_IncDir + " " - + m_pConfig->m_sComp_InstFlags + " " - + m_pConfig->m_sComp_Flags + " " - + m_pConfig->m_sComp_Args + " " - + m_pConfig->m_sComp_LdFlags + " " - + m_pConfig->m_sVT_LibDir + " " - + vtlib + " " - + m_pConfig->m_sComp_Libs; - - // execute/show compiler command - // - if( ( rc = executeOrShowCommand( cmd ) ) != 0 ) - return rc; - } - - // remove intermediate files (in non-verbose mode) - // - if( !show && !beverbose ) - { - for( i = 0; i < files_to_remove.size(); i++ ) - remove( files_to_remove[i].c_str() ); - } - - return 0; -} - -// private methods -// - -void -Wrapper::showVersion() -{ - std::cout << m_pConfig->m_sVT_Version << std::endl; -} - -void -Wrapper::showUsageText() -{ - std::string str_lang; - std::string str_lang_suffix; - - if( m_pConfig->m_eLangType == LANG_CC ) - { - str_lang = "C"; - str_lang_suffix = "cc "; - } - else if( m_pConfig->m_eLangType == LANG_CXX ) - { - str_lang = "C++"; - str_lang_suffix = "cxx"; - } - else if( m_pConfig->m_eLangType == LANG_F77 ) - { - str_lang = "Fortran 77"; - str_lang_suffix = "f77"; - } - else if( m_pConfig->m_eLangType == LANG_F90 ) - { - str_lang = "Fortran 90"; - str_lang_suffix = "f90"; - } - - std::cout << std::endl - << " " << ExeName << " - " << str_lang - << " compiler wrapper for VampirTrace." - << std::endl << std::endl - << " Syntax: " << ExeName << " " - << "[-vt:help] " - << "[-vt:version] " - << "[-vt:" << str_lang_suffix << " ] " - << "[-vt:inst ] " - << std::endl << " " - << "[-vt:] " - << "[-vt:opari ] [-vt:noopari]" << std::endl - << " [-vt:tau ] [-vt:pdt ] [-vt:verbose] [-vt:show] ..." - << std::endl << std::endl - << " options:" - << std::endl - << " -vt:help Show this help message." - << std::endl << std::endl - << " -vt:version Show VampirTrace version." - << std::endl << std::endl - << " -vt:" << str_lang_suffix << " " - << "Set the underlying compiler command." - << std::endl << std::endl - << " -vt:inst Set the instrumentation type." - << std::endl << std::endl - << " possible values:" - << std::endl << std::endl - << " compinst fully-automatic by compiler" - << std::endl - << " manual manual by using VampirTrace's API" - << std::endl - << " dyninst binary by using Dyninst" - << std::endl - << " tauinst automatic source code instrumentation by using PDT/TAU" - << std::endl << std::endl - << " -vt:opari Set options for the OPARI command." - << std::endl - << " (see " - << vt_installdirs_get(VT_INSTALLDIR_DATADIR) - << "/doc/opari/Readme.html for more information)" - << std::endl << std::endl - << " -vt:noopari Disable instrumentation of OpenMP contructs by OPARI." - << std::endl << std::endl - - - << " -vt:tau Set options for the TAU instrumentor command." - << std::endl << std::endl - << " -vt:pdt Set options for the PDT parse command." - << std::endl << std::endl - << " -vt:" - << std::endl - << " Enforce application's parallelization type." - << std::endl - << " It's only necessary if it could not be determined" - << std::endl - << " automatically based on underlying compiler and flags." - << std::endl - << " seq = sequential" - << std::endl - << " mpi = parallel (uses MPI)" - << std::endl - << " mt = parallel (uses OpenMP/POSIX threads)" - << std::endl - << " hyb = hybrid parallel (MPI + Threads)" - << std::endl - << " (default: automatically)" - << std::endl << std::endl - << " -vt:verbose Enable verbose mode." - << std::endl << std::endl - << " -vt:show Do not invoke the underlying compiler." - << std::endl - << " Instead, show the command line that would be" - << std::endl - << " executed to compile and link the program." - << std::endl << std::endl - << " See the man page for your underlying compiler for other options that can" - << std::endl - << " be passed through '" << ExeName << "'." - << std::endl << std::endl - << " environment variables:" - << std::endl - << " VT_INST Instrumentation type (equivalent to '-vt:inst'*)" - << std::endl; - if( m_pConfig->m_eLangType == LANG_CC ) - { - std::cout << " VT_CC C compiler command (equivalent to '-vt:" - << str_lang_suffix << "'*)" << std::endl - << " VT_CFLAGS C compiler flags" << std::endl; - } - else if( m_pConfig->m_eLangType == LANG_CXX ) - { - std::cout << " VT_CXX C++ compiler command (equivalent to '-vt:" - << str_lang_suffix << "'*)" << std::endl - << " VT_CXXFLAGS C++ compiler flags" << std::endl; - } - else if( m_pConfig->m_eLangType == LANG_F77 ) - { - std::cout << " VT_F77 Fortran 77 compiler command (equivalent to '-vt:" - << str_lang_suffix << "'*)" << std::endl - << " VT_FFLAGS Fortran 77 compiler flags" << std::endl; - } - else if( m_pConfig->m_eLangType == LANG_F90 ) - { - std::cout << " VT_F90 Fortran 90 compiler command (equivalent to '-vt:" - << str_lang_suffix <<"'*)" << std::endl - << " VT_FCFLAGS Fortran 90 compiler flags" << std::endl; - } - std::cout << " VT_LDFLAGS Linker flags" - << std::endl - << " VT_LIBS Libraries to pass to the linker" - << std::endl << std::endl - << " * The corresponding command line options overwrites the environment" - << std::endl - << " variables setting." - << std::endl << std::endl - << " examples:" - << std::endl - << " automatically instrumentation by compiler:" - << std::endl << std::endl; - if( m_pConfig->m_eLangType == LANG_CC ) - { - std::cout << " vtcc -vt:cc gcc -vt:inst compinst -c foo.c -o foo.o" - << std::endl - << " vtcc -vt:cc gcc -vt:inst compinst -c bar.c -o bar.o" - << std::endl - << " vtcc -vt:cc gcc -vt:inst compinst foo.o bar.o -o foo" - << std::endl << std::endl - << " manually instrumentation by using VT's API:" - << std::endl << std::endl - << " vtcc -vt:inst manual foobar.c -o foobar -DVTRACE"; - } - else if( m_pConfig->m_eLangType == LANG_CXX ) - { - std::cout << " vtcxx -vt:cxx g++ -vt:inst compinst -c foo.cpp -o foo.o" - << std::endl - << " vtcxx -vt:cxx g++ -vt:inst compinst bar.cpp -o bar.o" - << std::endl - << " vtcxx -vt:cxx g++ -vt:inst compinst foo.o bar.o -o foo" - << std::endl << std::endl - << " manually instrumentation by using VT's API:" - << std::endl << std::endl - << " vtcxx -vt:inst manual foobar.cpp -o foobar -DVTRACE"; - } - else if( m_pConfig->m_eLangType == LANG_F77 ) - { - std::cout << " vtf77 -vt:f77 g77 -vt:inst compinst -c foo.F -o foo.o" - << std::endl - << " vtf77 -vt:f77 g77 -vt:inst compinst bar.F -o bar.o" - << std::endl - << " vtf77 -vt:f77 g77 -vt:inst compinst foo.o bar.o -o foo" - << std::endl << std::endl - << " manually instrumentation by using VT's API:" - << std::endl << std::endl - << " vtf77 -vt:inst manual foobar.F -o foobar -DVTRACE"; - } - else if( m_pConfig->m_eLangType == LANG_F90 ) - { - std::cout << " vtf90 -vt:f90 gfortran -vt:inst compinst -c foo.F90 -o foo.o" - << std::endl - << " vtf90 -vt:f90 gfortran -vt:inst compinst bar.F90 -o bar.o" - << std::endl - << " vtf90 -vt:f90 gfortran -vt:inst compinst foo.o bar.o -o foo" - << std::endl << std::endl - << " manually instrumentation by using VT's API:" - << std::endl << std::endl - << " vtf90 -vt:inst manual foobar.F90 -o foobar -DVTRACE"; - } - - if( m_pConfig->m_eLangType == LANG_F77 || m_pConfig->m_eLangType == LANG_F90 ) - { - std::cout << std::endl << std::endl - << " IMPORTANT: Fortran source files instrumented by using VT's API" - << std::endl - << " have to be (CPP) preprocessed."; - } - std::cout << std::endl << std::endl; -} - -int -Wrapper::executeOrShowCommand( std::string & cmd ) -{ - int rc = 0; - - // remove double spaces from command - // - std::string::size_type i; - while( ( i = cmd.find( " " ) ) != std::string::npos ) - cmd.erase( i, 1 ); - - // either show - if( m_pConfig->m_bShow ) - { - std::cout << cmd << std::endl; - } - // or execute command - else - { - if( m_pConfig->m_bBeVerbose ) - std::cout << "+++ " << cmd << std::endl; - if( ( rc = system( cmd.c_str() ) ) != -1 ) - rc = WEXITSTATUS( rc ); - } - - return rc; -} - -std::vector -Wrapper::getIncFilesFromTabFile() -{ - std::vector vec_incfiles; - - std::ifstream in( m_pConfig->m_sOpari_TabFile.first.c_str() ); - if( in ) - { - char buffer[1024]; - std::string line; - - while( in.getline( buffer, sizeof( buffer ) ) ) - { - line = buffer; - - if( line.find( "#include" ) != std::string::npos - && line.find( ".opari.inc" ) != std::string::npos ) - { - std::string incfile = line.substr( line.find("#include")+10 ); - incfile.erase( incfile.length()-1 ); - - vec_incfiles.push_back( incfile ); - } - } - - in.close(); - } - - return vec_incfiles; -} - - -//////////////////// class Config //////////////////// - -// public methods -// - -Config::Config() : - m_eLangType(LANG_CC), m_eInstType(INST_TYPE_MANUAL), m_iInstAvail(0), - - m_bBeVerbose(false), m_bCompOnly(false), m_bOutfileGiven(false), - m_bUsesMpi(false), m_bUsesThreads(false), - m_bUsesOpenMP(false), m_bKeepOpariRcFile(false), - m_bShow(false) -{ - m_sOpari_RcFile = "opari.rc"; - m_sOpari_TabFile = std::make_pair(std::string("opari.tab.c"), - std::string("opari.tab.o")); -} - -Config::~Config() -{ - // empty + return !error; } bool -Config::setLanguage( const LangTypeT lang ) +readEnvironmentVars() { -#if !(defined(HAVE_F77) && HAVE_F77) || !(defined(HAVE_F90) && HAVE_F90) - bool error = false; - std::string str_lang; + char* env; - if( lang == LANG_F77 ) - { -# if !(defined(HAVE_F77) && HAVE_F77) - str_lang = "Fortran 77"; - error = true; -# endif // HAVE_F77 - } - else if( lang == LANG_F90 ) - { -# if !(defined(HAVE_F90) && HAVE_F90) - str_lang = "Fortran 90"; - error = true; -# endif // HAVE_F90 - } + // read environment var. for compiler command + // (VT_) + // + env = getenv( Config.comp_cmdenv.c_str() ); + if( env ) Config.setCompilerCmd( env ); - if( !error ) - { - m_eLangType = lang; - } - else - { - std::cerr << "Unfortunately, this installation of VampirTrace " - << "was not compiled with" << std::endl - << str_lang << " support. As such, the " << ExeName - << " compiler is non-functional." << std::endl; - } + // read environment var. for extra compiler flags + // (VT_FLAGS) + env = getenv( Config.comp_flagsenv.c_str() ); + if( env ) + { + if( Config.comp_flags.length() > 0 ) + Config.comp_flags += " "; + Config.comp_flags += env; + } - return !error; -#else // HAVE_F77 || HAVE_F90 - m_eLangType = lang; - return true; -#endif // HAVE_F77 || HAVE_F90 + // read environment var. for extra linker flags + // (VT_LDFLAGS) + env = getenv( "VT_LDFLAGS" ); + if( env ) Config.comp_ldflags = env; + + // read environment var. for extra libs + // (VT_LIBS) + env = getenv( "VT_LIBS" ); + if( env ) + { + if( Config.comp_libs.length() > 0 ) + Config.comp_libs += " "; + Config.comp_libs += env; + } + + // read environment var. for instrumentation type + // (VT_INST) + // + env = getenv( "VT_INST" ); + if( env ) + { + if( !Config.setInstType( env ) ) + { + std::cerr << ExeName << ": Error: VT_INST: " + << "Unknown or not supported instrumentation type '" + << env << "'. Aborting." << std::endl; + return false; + } + } + + return true; } -void -Config::compiler_setCmd( const std::string cmd ) +bool +parseCommandLine( int argc, char** argv ) { - std::string bcomp = cmd; - std::string::size_type ls = cmd.rfind('/'); + std::vector args; + std::string arg; + uint32_t i; - if( ls != std::string::npos ) bcomp = cmd.substr( ls+1 ); + // pre-process arguments + // + for( i = 1; i < (uint32_t)argc; i++ ) + { + arg = argv[i]; - if( !m_bUsesMpi && - ( bcomp.compare( 0, 2, "mp" ) == 0 - || bcomp.compare( 0, 4, "sxmp" ) == 0 - || bcomp.compare( 0, 4, "scmp" ) == 0 ) ) - setUsesMpi( true ); + // we also accept "--vt:" - modify "--vt:" to "-vt:" + // + if( arg.compare( 0, 5, "--vt:" ) == 0 ) + { + arg.erase( 0, 1 ); + } - if( bcomp.compare( 0, 3, "xlf" ) == 0 - || bcomp.compare( 0, 9, "blrts_xlf" ) == 0 - || bcomp.compare( 0, 3, "bgf" ) == 0 ) - m_sComp_FDFlag = "-WF,-D"; - else - m_sComp_FDFlag = "-D"; + // merge separated compiler arguments + // - + // ^ + if( arg.compare( "-I" ) == 0 || + arg.compare( "-D" ) == 0 || + arg.compare( "-L" ) == 0 || + arg.compare( "-l" ) == 0 ) + { + if( i < (uint32_t)argc - 1 ) + arg += argv[++i]; + } - m_sComp_Cmd = cmd; + args.push_back( arg ); + } + + for( i = 0; i < args.size(); i++ ) + { + arg = args[i]; + + // -vt:help + // + if( arg.compare( "-vt:help" ) == 0 ) + { + showUsage(); + exit(0); + } + + // -vt:version + // + if( arg.compare( "-vt:version" ) == 0 ) + { + std::cout << Config.vt_version << std::endl; + exit(0); + } + // -vt:show, -vt:showme + // + else if( arg.compare( "-vt:show" ) == 0 || + arg.compare( "-vt:showme" ) == 0 ) + { + Config.showme_flags = SHOWME_FLAG_ALL; + } + // -vt:showme-compile + // + else if( arg.compare( "-vt:showme-compile" ) == 0 ) + { + if( ( Config.showme_flags & SHOWME_FLAG_ALL ) != 0 ) + Config.showme_flags ^= SHOWME_FLAG_ALL; + Config.showme_flags |= SHOWME_FLAG_COMPILE; + } + // -vt:showme-link + // + else if( arg.compare( "-vt:showme-link" ) == 0 ) + { + if( ( Config.showme_flags & SHOWME_FLAG_ALL ) != 0 ) + Config.showme_flags ^= SHOWME_FLAG_ALL; + Config.showme_flags |= SHOWME_FLAG_LINK; + } + // -vt:verbose + // + else if( arg.compare( "-vt:verbose" ) == 0 ) + { + Config.be_verbose = true; + } + // -vt:inst + // + else if( arg.compare( "-vt:inst" ) == 0 ) + { + if( i == args.size() - 1 ) + { + std::cerr << ExeName << ": expected -- -vt:inst" + << std::endl; + return false; + } + + arg = args[++i]; + + if( !Config.setInstType( arg ) ) + { + std::cerr << ExeName << ": " + << "unknown or not supported instrumentation type '" + << arg << "'" << std::endl; + return false; + } + } + // -vt:opari + // + else if( arg.compare( "-vt:opari" ) == 0 ) + { + if( i == args.size() - 1 ) + { + std::cerr << ExeName << ": expected -- -vt:opari" + << std::endl; + return false; + } + + size_t opari_args_len = args[i+1].length()+1; + char* opari_args = new char[opari_args_len]; + strncpy( opari_args, args[++i].c_str(), opari_args_len - 1 ); + opari_args[opari_args_len - 1] = '\0'; + + char* token = strtok( opari_args, " " ); + do + { + if( strcmp( token, "-rcfile" ) == 0 ) + { + token = strtok( 0, " " ); + if( !token ) + { + std::cerr << ExeName << ": expected -- -rcfile" + << std::endl; + delete [] opari_args; + return false; + } + + Config.setOpariRcFile( token ); + } + else if( strcmp( token, "-table" ) == 0 ) + { + token = strtok( 0, " " ); + if( !token ) + { + std::cerr << ExeName << ": expected -- -table" + << std::endl; + delete [] opari_args; + return false; + } + + Config.setOpariTabFile( token ); + } + else + { + Config.addOpariArg( token ); + } + } while( ( token = strtok( 0, " " ) ) ); + + delete [] opari_args; + } + // -vt:noopari + // + else if( arg.compare( "-vt:noopari" ) == 0 ) + { + Config.setUsesOpenMP( false, true ); + } + // -vt:tau + // + else if( arg.compare( "-vt:tau" ) == 0 ) + { + if( i == args.size() - 1 ) + { + std::cerr << ExeName << ": expected -- -vt:tau" + << std::endl; + return false; + } + + Config.addTauinstArg( args[++i] ); + } + // -vt:pdt + // + else if( arg.compare( "-vt:pdt" ) == 0 ) + { + if( i == args.size() - 1 ) + { + std::cerr << ExeName << ": expected -- -vt:pdt" + << std::endl; + return false; + } + + Config.addTauinstParseArg( args[++i] ); + } + // -vt:seq + // + else if( arg.compare( "-vt:seq" ) == 0 ) + { + Config.setUsesMpi( false, true ); + Config.setUsesThreads( false, true ); + Config.setUsesOpenMP( false, true ); + } + // -vt:mpi + // + else if( arg.compare( "-vt:mpi" ) == 0 ) + { + Config.setUsesMpi( true, true ); + Config.setUsesThreads( false, true ); + Config.setUsesOpenMP( false, true ); + } + // -vt:mt + // + else if( arg.compare( "-vt:mt" ) == 0 ) + { + Config.setUsesMpi( false, true ); + Config.setUsesThreads( true, true ); + } + // -vt:hyb + // + else if( arg.compare( "-vt:hyb" ) == 0 ) + { + Config.setUsesMpi( true, true ); + Config.setUsesThreads( true, true ); + } + // pthread flags/libs + // + else if( arg.compare( "-Kthread" ) == 0 || + arg.compare( "-kthread" ) == 0 || + arg.compare( "-pthread" ) == 0 || + arg.compare( "-pthreads" ) == 0 || + arg.compare( "-mthreads" ) == 0 || + arg.compare( "--thread-safe" ) == 0 || + arg.compare( "-lpthreads" ) == 0 || + arg.compare( "-llthread" ) == 0 || + arg.compare( "-lpthread" ) == 0 ) + { + Config.setUsesThreads( true ); + } + // openmp flag + // + else if( arg.compare( "-openmp" ) == 0 || + arg.compare( "-fopenmp" ) == 0 || + arg.compare( "-Popenmp" ) == 0 || + arg.compare( "-xopenmp" ) == 0 || + arg.compare( "-mp" ) == 0 ) + { + Config.setUsesThreads( true ); + Config.setUsesOpenMP( true ); + } + else if( arg.length() > 6 && arg.compare( 0, 6, "-qsmp=" ) == 0 ) + { + char carg[128]; + strncpy( carg, arg.substr(6).c_str(), sizeof( carg ) - 1 ); + carg[sizeof( carg ) - 1] = '\0'; + + char* token = strtok( carg, ":" ); + do + { + if( strcmp( token, "omp" ) == 0 ) + { + Config.setUsesThreads( true ); + Config.setUsesOpenMP( true ); + break; + } + } while( ( token = strtok( 0, ":" ) ) ); + } + // nvcc's pthread/openmp flag + // + else if( arg.compare( 0, 10, "-Xcompiler" ) == 0 || + arg.compare( 0, 18, "--compiler-options" ) == 0 || + arg.compare( 0, 8, "-Xlinker" ) == 0 || + arg.compare( 0, 16, "--linker-options" ) == 0 ) + { + if( arg.find( "-pthread" ) != std::string::npos ) + Config.setUsesThreads( true ); + + if( arg.find( "-fopenmp" ) != std::string::npos ) + { + Config.setUsesThreads( true ); + Config.setUsesOpenMP( true ); + } + } + } + + bool addlibs = false; + + for( i = 0; i < args.size(); i++ ) + { + arg = args[i]; + + // escape '\', '"', ''', ' ', '(', and ')' + // + const char special_char[] = "\\\"' ()"; + size_t found = arg.find_first_of( special_char ); + while( found != std::string::npos ) + { + arg.insert( found, "\\" ); + found = arg.find_first_of( special_char, found + 2 ); + } + + // -vt:help, -vt:version, -vt:show, -vt:showme, vt:showme-compile, + // -vt:showme-link, -vt:seq, -vt:mpi, -vt:mt, -vt:hyb, + // -vt:inst, -vt:opari, -vt:tau, -vt:pdt + // (processed above; ignore here) + // + if( arg.compare( "-vt:help" ) == 0 || + arg.compare( "-vt:version" ) == 0 || + arg.compare( "-vt:show" ) == 0 || + arg.compare( "-vt:showme" ) == 0 || + arg.compare( "-vt:showme-compile" ) == 0 || + arg.compare( "-vt:showme-link" ) == 0 || + arg.compare( "-vt:verbose" ) == 0 || + arg.compare( "-vt:seq" ) == 0 || + arg.compare( "-vt:mpi" ) == 0 || + arg.compare( "-vt:mt" ) == 0 || + arg.compare( "-vt:hyb" ) == 0 || + arg.compare( "-vt:inst" ) == 0 || + arg.compare( "-vt:opari" ) == 0 || + arg.compare( "-vt:noopari" ) == 0 || + arg.compare( "-vt:tau" ) == 0 || + arg.compare( "-vt:pdt" ) == 0 ) + { + // do nothing + + // skip next argument, if necessary + if( arg.compare("-vt:inst") == 0 || + arg.compare("-vt:opari") == 0 || + arg.compare("-vt:tau") == 0 || + arg.compare("-vt:pdt") == 0 ) + { + i++; + } + } + // -vt: + // + else if( ( Config.lang_type == LANG_CC && + arg.compare( "-vt:cc" ) == 0 ) || + ( Config.lang_type == LANG_CXX && + ( arg.compare( "-vt:CC" ) == 0 || + arg.compare( "-vt:c++" ) == 0 || + arg.compare( "-vt:cxx" ) == 0 ) ) || + ( Config.lang_type == LANG_F77 && + arg.compare( "-vt:f77" ) == 0 ) || + ( Config.lang_type == LANG_F90 && + arg.compare( "-vt:f90" ) == 0 ) ) + { + if( i == args.size() - 1 ) + { + std::cerr << ExeName << ": expected -- " + << arg << std::endl; + return false; + } + + Config.setCompilerCmd( args[++i] ); + } + // -vt:* -> unknown wrapper argument + // + else if( arg.compare( 0, 4, "-vt:" ) == 0 ) + { + std::cerr << ExeName << ": unknown option -- " + << arg << std::endl; + return false; + } + // source file + // + else if( ( arg.length() >= 2 && + arg.compare( arg.length() - 2, 2, ".c" ) == 0 ) || + ( arg.length() >= 2 && + arg.compare( arg.length() - 2, 2, ".C" ) == 0 ) || + ( arg.length() >= 3 && + arg.compare( arg.length() - 3, 3, ".cc" ) == 0 ) || + ( arg.length() >= 3 && + arg.compare( arg.length() - 3, 3, ".CC" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".cpp" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".CPP" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".cxx" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".CXX" ) == 0 ) || + ( arg.length() >= 2 && + arg.compare( arg.length() - 2, 2, ".f" ) == 0 ) || + ( arg.length() >= 2 && + arg.compare( arg.length() - 2, 2, ".F" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".f77" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".F77" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".f90" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".F90" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".f95" ) == 0 ) || + ( arg.length() >= 4 && + arg.compare( arg.length() - 4, 4, ".F95" ) == 0 ) || + ( arg.length() >= 3 && + arg.compare( arg.length() - 3, 3, ".cu" ) == 0 ) ) + { + if( Config.showme_flags == 0 || Config.showme_flags == SHOWME_FLAG_ALL ) + { + Config.addModSrcFile( arg ); + } + else + { + Config.addCompilerArg( arg ); + } + } + // -* + // + else if( arg.compare( 0, 2, "-I" ) == 0 || + arg.compare( 0, 2, "-D" ) == 0 ) + { + if( Config.inst_type == INST_TYPE_TAUINST ) + Config.addTauinstParseArg( arg ); + Config.addCompilerArg( arg ); + } + // -WF,-D* + // + else if( Config.fortran() && arg.compare( 0, 6, "-WF,-D" ) == 0 ) + { + if( Config.inst_type == INST_TYPE_TAUINST ) + Config.addTauinstParseArg( arg.substr( 4 ) ); + Config.addCompilerArg( arg ); + } + // Fortran line length flag + // + else if( Config.fortran() && + ( arg.compare( "-ffixed-line-length-132" ) == 0 || + arg.compare( "-extend_source" ) == 0 || + arg.compare( "-Mextend" ) == 0 || + arg.compare( "-e" ) == 0 || + arg.compare( "-qfixed=132" ) == 0 ) ) + { + if( Config.inst_type == INST_TYPE_TAUINST ) + Config.addTauinstParseArg( "-ffixed-line-length-132" ); + Config.addCompilerArg( arg ); + } + // Fortran free format flag + // + else if( Config.fortran() && + ( arg.compare( "-ffree-form" ) == 0 || + arg.compare( "-free" ) == 0 || + arg.compare( "-Mfree" ) == 0 || + arg.compare( 0, 6, "-qfree" ) == 0 ) ) + { + if( Config.inst_type == INST_TYPE_TAUINST || + Config.tauinst_parsecmd.compare( "f95parse" ) == 0 ) + Config.addTauinstParseArg( "-R free" ); + Config.addCompilerArg( arg ); + } + // Fortran fixed format flag + // + else if( Config.fortran() && + ( arg.compare( "-ffixed-form" ) == 0 || + arg.compare( "-fixed" ) == 0 || + arg.compare( "-Mfixed" ) == 0 || + arg.compare( 0, 7, "-qfixed" ) == 0 ) ) + { + if( Config.inst_type == INST_TYPE_TAUINST && + Config.tauinst_parsecmd.compare( "f95parse" ) == 0 ) + Config.addTauinstParseArg( "-R fixed" ); + Config.addCompilerArg( arg ); + } + // -c + // + else if( arg.compare( "-c" ) == 0 ) + { + Config.comp_only = true; + Config.addCompilerArg( arg ); + } + // -o + // + else if( arg.compare( "-o" ) == 0 ) + { + Config.outfile_given = true; + Config.addCompilerArg( arg ); + } + // -lcuda[rt] + // + else if( arg.compare( "-lcuda" ) == 0 || arg.compare( "-lcudart" ) == 0 ) + { + Config.addCompilerLib( arg ); + } + // -l + // + else if( arg.compare( 0, 5, "-lmpi" ) == 0 || + arg.compare( 0, 7, "-lmtmpi" ) == 0 || + arg.compare( 0, 7, "-lhpmpi" ) == 0 || + arg.compare( 0, 7, "-lscmpi" ) == 0 ) + { + Config.setUsesMpi( true ); + Config.addCompilerLib( arg ); + addlibs = true; + } + // -* + // + else if( arg.compare( 0, 2, "-L" ) == 0 || arg.compare( 0, 2, "-l" ) == 0 ) + { + if( addlibs ) + Config.addCompilerLib( arg ); + else + Config.addCompilerArg( arg ); + } + // unknown argument + // + else + { + Config.addCompilerArg( arg ); + } + } + + return true; } -void -Config::compiler_addArg( const std::string arg ) +int +doWrap() { - if( m_sComp_Args.length() > 0 ) m_sComp_Args += " "; - m_sComp_Args += arg; -} + int rc = 0; -void -Config::compiler_addLib( const std::string lib ) -{ - if( m_sComp_Libs.length() > 0 ) m_sComp_Libs += " "; - m_sComp_Libs += lib; -} + // call compiler without any parameters, if + // insufficient arguments given + // + if( Config.showme_flags == 0 && Config.comp_args.length() == 0 ) + { + rc = system( Config.comp_cmd.c_str() ); + return WEXITSTATUS( rc ); + } -void -Config::compiler_addSrcFile( const std::string file ) -{ - std::string file_base; - std::string file_obj; - std::string::size_type si; + std::string cmd; + uint32_t i; - // get base name of source file - // - file_base = file; - si = file.rfind( '/' ); - if( si != std::string::npos ) - file_base = file.substr( si+1 ); + // vector which holds all intermediately created files + std::vector files_to_remove; - // create object file name of source file - // - si = file_base.rfind( '.' ); - assert( si != std::string::npos ); - file_obj = file_base.substr( 0, si ) + ".o"; + // map which holds all object files created by the compiler + // which must be renamed to original file names + std::map obj_files_to_rename; - // store source/object file name for later processing by OPARI and/or TAU - // - m_vecComp_SrcFiles.push_back( file ); - m_vecComp_ObjFiles.push_back( file_obj ); + // process source files by OPARI and/or TAU + // + for( i = 0; i < Config.mod_files.size(); i++ ) + { + std::string src_file = Config.mod_files[i].first; - // add (modified) source file name to compiler arguments - // - if( m_eInstType == INST_TYPE_TAUINST || m_bUsesOpenMP ) - { - std::string mod_file = file; + std::string::size_type si; + // run OPARI command on source file + // + if( Config.uses_openmp ) + { + // compose OPARI command + // + cmd = + Config.opari_cmd + " " + + Config.opari_args + " " + + "-rcfile " + Config.opari_rcfile + " " + + "-table " + Config.opari_tabfile.first + " " + + src_file; + + // show/execute OPARI command + if( ( rc = showOrExecuteCommand( cmd ) ) != 0 ) + return rc; + + // create OPARI modified source file name + // + + std::string mod_file = src_file; si = mod_file.rfind( '.' ); assert( si != std::string::npos ); - - if( m_eInstType == INST_TYPE_TAUINST ) - mod_file.insert( si, ".tau" ); - else - mod_file.insert( si, ".mod" ); + mod_file.insert( si, ".mod" ); // convert Fortran source file suffix to upper case, in order to // invoke the C preprocessor before compiling // - if( m_eLangType == LANG_F77 || m_eLangType == LANG_F90 ) + if( Config.fortran() ) { - si = mod_file.rfind( ".f" ); - if( si != std::string::npos ) mod_file.replace( si, 2, ".F" ); + si = mod_file.rfind( ".f" ); + if( si != std::string::npos ) mod_file.replace( si, 2, ".F" ); } - compiler_addArg( mod_file ); - } - else - { - compiler_addArg( file ); - } -} + files_to_remove.push_back( mod_file ); -void -Config::opari_setRcFile( const std::string file ) -{ - m_sOpari_RcFile = file; - m_bKeepOpariRcFile = true; -} - -void -Config::opari_setTabFile( const std::string file ) -{ - std::string file_src; - std::string file_obj; - - if( !( file.length() >= 2 - && file.compare( file.length()-2, 2, ".c" ) == 0 ) ) - { - file_src = file + ".c"; - file_obj = file + ".o"; - } - else - { - file_src = file_obj = file; - file_obj.replace( file.length()-2, 2, ".o" ); - } - - m_sOpari_TabFile = std::make_pair( file_src, file_obj ); -} - -void -Config::opari_addArg( const std::string arg ) -{ - if( m_sOpari_Args.length() > 0 ) m_sOpari_Args += " "; - m_sOpari_Args += arg; -} - -void -Config::tauinst_addArg( const std::string arg ) -{ - if( m_sTauInst_Args.length() > 0 ) m_sTauInst_Args += " "; - m_sTauInst_Args += arg; -} - -void -Config::tauinst_addParseArg( const std::string arg ) -{ - if( m_sTauInst_ParseArgs.length() > 0 ) m_sTauInst_ParseArgs += " "; - m_sTauInst_ParseArgs += arg; -} - -void -Config::setUsesMpi( const bool set, const bool ovwrt ) -{ - static bool first = true; - - if( first || ovwrt ) - { - if( set ) + // create OPARI include file name + // + if( !Config.fortran() ) { + std::string inc_file = src_file + ".opari.inc"; + files_to_remove.push_back( inc_file ); + } + + src_file = mod_file; + } + + // run PDT parser and TAU instrumentor command on source file + // + if( Config.inst_type == INST_TYPE_TAUINST ) + { + // adjust PDT parser options, if source file is instrumented by OPARI + // + if( Config.uses_openmp ) + { + // current directory to find OPARI generated header files + // (only necessary for C/C++) + // + if( !Config.fortran() ) + Config.addTauinstParseArg( "-I." ); + + // macro definition '_OPENMP' + // (the PDT parser has no own option to enable OpenMP) + Config.addTauinstParseArg( "-D_OPENMP" ); + } + + // compose PDT parse command + // + cmd = + Config.tauinst_parsecmd + " " + + src_file + " " + + Config.vt_incdir + " " + + Config.tauinst_parseargs; + + // show/execute PDT parse command + if( ( rc = showOrExecuteCommand( cmd ) ) != 0 ) + return rc; + + // create PDB file name + // + + std::string pdb_file = src_file; + si = src_file.rfind( '/' ); + if( si != std::string::npos ) + pdb_file = src_file.substr( si+1 ); + + si = pdb_file.rfind( '.' ); + assert( si != std::string::npos ); + pdb_file.replace( si, 4, ".pdb" ); + + files_to_remove.push_back( pdb_file ); + + // create TAU modified source file name + // + std::string tau_file = src_file; + if( Config.uses_openmp ) + { + si = tau_file.rfind( ".mod" ); + assert( si != std::string::npos ); + tau_file.replace( si, 4, ".tau" ); + } + else + { + si = tau_file.rfind( '.' ); + assert( si != std::string::npos ); + tau_file.insert( si, ".tau" ); + + // convert Fortran source file suffix to upper case, in order to + // invoke the C preprocessor before compiling + // + if( Config.fortran() ) + { + si = tau_file.rfind( ".f" ); + if( si != std::string::npos ) tau_file.replace( si, 2, ".F" ); + } + } + files_to_remove.push_back( tau_file ); + + // compose TAU instrumentor command + // + cmd = + Config.tauinst_cmd + " " + + pdb_file + " " + + src_file + " " + + "-o " + + tau_file + " " + + Config.tauinst_args; + + // show/execute TAU instrumentor command + if( ( rc = showOrExecuteCommand( cmd ) ) != 0 ) + return rc; + + src_file = tau_file; + } + + // create and store compiler output file name for renaming, if it's not + // specified by the command line + // + if( Config.comp_only && !Config.outfile_given ) + { + std::string obj_file = src_file; + + si = src_file.rfind( '/' ); + if( si != std::string::npos ) + obj_file = src_file.substr( si+1 ); + + si = obj_file.rfind( '.' ); + assert( si != std::string::npos ); + obj_file = obj_file.substr( 0, si ) + ".o"; + + obj_files_to_rename[obj_file] = Config.mod_files[i].second; + } + } + + if( Config.uses_openmp ) + { + // add current working directory to include search path to find OPARI + // generated header files (only necessary for C/C++) + // + if( !Config.fortran() ) + Config.addCompilerArg( "-I." ); + + // If the source file(s) are instrumented by OPARI *and* TAU, the source + // code locations determined by TAU are nonsense. Add compiler flag to + // disable recording of source code locations. + // + if( Config.inst_type == INST_TYPE_TAUINST ) + Config.addCompilerArg( Config.comp_fdflag + "TAUINST_NOSRC" ); + } + + // compile only ? + if( Config.comp_only ) + { + // compose compiler command + // + cmd = + Config.comp_cmd + " " + + Config.vt_incdir + " " + + Config.comp_instflags + " " + + Config.comp_flags + " " + + Config.comp_args; + + // show/execute compiler command + if( ( rc = showOrExecuteCommand( cmd ) ) != 0 ) + return rc; + + // rename compiler output files to original file names + // + if( Config.showme_flags == 0 ) + { + for( std::map::iterator it = + obj_files_to_rename.begin(); it != obj_files_to_rename.end(); it++ ) + { + if( Config.be_verbose ) + { + std::cout << "+++ rename " << it->first + << " to " << it->second << std::endl; + } + + if( rename( it->first.c_str(), it->second.c_str() ) == -1 ) + { + std::cerr << ExeName << ": could not rename " << it->first + << " to " << it->second << std::endl; + return 1; + } + } + } + } + // [compile and] link + else + { + std::string vtlib; + + if( Config.uses_openmp ) + { + // compose command for compiling OPARI table file + // + cmd = + Config.opari_tab_compcmd + " " + + Config.opari_tab_compflags + " " + + Config.vt_incdir + " " + + ( Config.fortran() ? "-I. " : "" ) + + "-c " + + Config.opari_tabfile.first + " " + + "-o " + + Config.opari_tabfile.second; + + // show/execute compiler command + if( ( rc = showOrExecuteCommand( cmd ) ) != 0 ) + return rc; + + // add OPARI table object file to to linker arguments + Config.addCompilerArg( Config.opari_tabfile.second ); + + // collect intermediate OPARI output files for removing + // + + // OPARI include files + // + if( Config.fortran() ) + { + std::vector incfiles; + getIncFilesFromTabFile( incfiles ); + for( i = 0; i < incfiles.size(); i++ ) + files_to_remove.push_back( incfiles[i].c_str() ); + } + + // OPARI table source/object file + // + files_to_remove.push_back( Config.opari_tabfile.first ); + files_to_remove.push_back( Config.opari_tabfile.second ); + + // OPARI rc file + // + if( !Config.opari_keep_rcfile ) + files_to_remove.push_back( Config.opari_rcfile ); + } + + // compose compiler command + // + + if( Config.inst_type == INST_TYPE_DYNINST ) + vtlib = Config.vt_dynattlib; + + if( Config.uses_threads ) + { + if( Config.uses_openmp ) + vtlib += " " + Config.vt_pomplib; + + if( Config.uses_mpi ) + vtlib += " " + Config.vt_hyblib; + else + vtlib += " " + Config.vt_mtlib; + } + else + { + if( Config.uses_mpi ) + vtlib += " " + Config.vt_mpilib; + else + vtlib += " " + Config.vt_seqlib; + } + + cmd = + Config.comp_cmd + " " + + Config.vt_incdir + " " + + Config.comp_instflags + " " + + Config.comp_flags + " " + + Config.comp_args + " " + + Config.comp_ldflags + " " + + Config.vt_libdir + " " + + vtlib + " " + + Config.comp_libs; + + // show/execute compiler command + if( ( rc = showOrExecuteCommand( cmd ) ) != 0 ) + return rc; + } + + // remove intermediate files (in non-verbose mode) + // + if( Config.showme_flags == 0 && !Config.be_verbose ) + { + for( i = 0; i < files_to_remove.size(); i++ ) + remove( files_to_remove[i].c_str() ); + } + + return 0; +} + +void +showFlags() +{ + std::string flags; + + // add compiler flags + // + if( ( Config.showme_flags & SHOWME_FLAG_COMPILE ) != 0 ) + { + flags += + Config.vt_incdir + " " + + Config.comp_flags + " "; + } + + // add linker flags + // + if( ( Config.showme_flags & SHOWME_FLAG_LINK ) != 0 ) + { + std::string vtlib; + + if( Config.inst_type == INST_TYPE_DYNINST ) + vtlib = Config.vt_dynattlib; + + if( Config.uses_threads ) + { + if( Config.uses_openmp ) + vtlib += " " + Config.vt_pomplib; + + if( Config.uses_mpi ) + vtlib += " " + Config.vt_hyblib; + else + vtlib += " " + Config.vt_mtlib; + } + else + { + if( Config.uses_mpi ) + vtlib += " " + Config.vt_mpilib; + else + vtlib += " " + Config.vt_seqlib; + } + + flags += + Config.comp_ldflags + " " + + Config.vt_libdir + " " + + vtlib + " " + + Config.comp_libs; + } + + // add common flags + // + flags += + Config.comp_instflags + " " + + Config.comp_args; + + // remove leading, trailing, and double spaces + trimString( flags ); + + // show flags + std::cout << flags << std::endl; +} + +void +showUsage() +{ + std::string str_lang; + std::string str_lang_suffix; + + switch( Config.lang_type ) + { + case LANG_CC: + str_lang = "C"; + str_lang_suffix = "cc "; + break; + case LANG_CXX: + str_lang = "C++"; + str_lang_suffix = "cxx"; + break; + case LANG_F77: + str_lang = "Fortran 77"; + str_lang_suffix = "f77"; + break; + case LANG_F90: + str_lang = "Fortran 90"; + str_lang_suffix = "f90"; + break; + } + + std::cout << std::endl + << " " << ExeName << " - " << str_lang << " compiler wrapper for VampirTrace." << std::endl + << std::endl + << " Syntax: " << ExeName << " [-vt:help] [-vt:version] [-vt:" << str_lang_suffix << " ] [-vt:inst ] " << std::endl + << " [-vt:] " << "[-vt:opari ] [-vt:noopari]" << std::endl + << " [-vt:tau ] [-vt:pdt ] [-vt:verbose]" << std::endl + << " [-vt:showme|-vt:showme-compile|-vt:showme-link] ..." << std::endl + << std::endl + << " options:" << std::endl + << " -vt:help Show this help message." << std::endl + << std::endl + << " -vt:version Show VampirTrace version." << std::endl + << std::endl + << " -vt:" << str_lang_suffix << " Set the underlying compiler command." << std::endl + << std::endl + << " -vt:inst Set the instrumentation type." << std::endl + << std::endl + << " possible values:" << std::endl + << std::endl + << " compinst fully-automatic by compiler" << std::endl + << " manual manual by using VampirTrace's API" << std::endl + << " dyninst binary by using Dyninst" << std::endl + << " tauinst automatic source code instrumentation by using PDT/TAU" << std::endl + << std::endl + << " -vt:opari Set options for the OPARI command." << std::endl + << " (see " << vt_installdirs_get(VT_INSTALLDIR_DATADIR) << "/doc/opari/Readme.html for more information)" << std::endl + << std::endl + << " -vt:noopari Disable instrumentation of OpenMP contructs by OPARI." << std::endl + << std::endl + << " -vt:tau Set options for the TAU instrumentor command." << std::endl + << std::endl + << " -vt:pdt Set options for the PDT parse command." << std::endl + << std::endl + << " -vt:" << std::endl + << " Enforce application's parallelization type." << std::endl + << " It's only necessary if it could not be determined" << std::endl + << " automatically based on underlying compiler and flags." << std::endl + << " seq = sequential" << std::endl + << " mpi = parallel (uses MPI)" << std::endl + << " mt = parallel (uses OpenMP/POSIX threads)" << std::endl + << " hyb = hybrid parallel (MPI + Threads)" << std::endl + << " (default: automatically)" << std::endl + << std::endl + << " -vt:verbose Enable verbose mode." << std::endl + << std::endl + << " -vt:show[me] Do not invoke the underlying compiler." << std::endl + << " Instead, show the command line(s) that would be" << std::endl + << " executed to compile and link the program." << std::endl + << std::endl + << " -vt:showme-compile Do not invoke the underlying compiler." << std::endl + << " Instead, show the compiler flags that would be" << std::endl + << " supplied to the compiler." << std::endl + << std::endl + << " -vt:showme-link Do not invoke the underlying compiler." << std::endl + << " Instead, show the linker flags that would be" << std::endl + << " supplied to the compiler." << std::endl + << std::endl + << " See the man page for your underlying compiler for other options that can" << std::endl + << " be passed through '" << ExeName << "'." << std::endl + << std::endl + << " environment variables:" << std::endl + << " VT_INST Instrumentation type (equivalent to '-vt:inst'*)" << std::endl; + switch( Config.lang_type ) + { + case LANG_CC: + std::cout << " VT_CC C compiler command (equivalent to '-vt:" << str_lang_suffix << "'*)" << std::endl + << " VT_CFLAGS C compiler flags" << std::endl; + break; + case LANG_CXX: + std::cout << " VT_CXX C++ compiler command (equivalent to '-vt:" << str_lang_suffix << "'*)" << std::endl + << " VT_CXXFLAGS C++ compiler flags" << std::endl; + break; + case LANG_F77: + std::cout << " VT_F77 Fortran 77 compiler command (equivalent to '-vt:" << str_lang_suffix << "'*)" << std::endl + << " VT_FFLAGS Fortran 77 compiler flags" << std::endl; + break; + case LANG_F90: + std::cout << " VT_F90 Fortran 90 compiler command (equivalent to '-vt:" << str_lang_suffix <<"'*)" << std::endl + << " VT_FCFLAGS Fortran 90 compiler flags" << std::endl; + break; + } + std::cout << " VT_LDFLAGS Linker flags" << std::endl + << " VT_LIBS Libraries to pass to the linker" << std::endl + << std::endl + << " * The corresponding command line options overwrites the environment" << std::endl + << " variables setting." << std::endl + << std::endl + << " examples:" << std::endl + << " automatically instrumentation by compiler:" << std::endl + << std::endl; + switch( Config.lang_type ) + { + case LANG_CC: + std::cout << " vtcc -vt:cc gcc -vt:inst compinst -c foo.c -o foo.o" << std::endl + << " vtcc -vt:cc gcc -vt:inst compinst -c bar.c -o bar.o" << std::endl + << " vtcc -vt:cc gcc -vt:inst compinst foo.o bar.o -o foo" << std::endl + << std::endl + << " manually instrumentation by using VT's API:" << std::endl + << std::endl + << " vtcc -vt:inst manual foobar.c -o foobar -DVTRACE"; + break; + case LANG_CXX: + std::cout << " vtcxx -vt:cxx g++ -vt:inst compinst -c foo.cpp -o foo.o" << std::endl + << " vtcxx -vt:cxx g++ -vt:inst compinst bar.cpp -o bar.o" << std::endl + << " vtcxx -vt:cxx g++ -vt:inst compinst foo.o bar.o -o foo" << std::endl + << std::endl + << " manually instrumentation by using VT's API:" << std::endl + << std::endl + << " vtcxx -vt:inst manual foobar.cpp -o foobar -DVTRACE"; + break; + case LANG_F77: + std::cout << " vtf77 -vt:f77 g77 -vt:inst compinst -c foo.F -o foo.o" << std::endl + << " vtf77 -vt:f77 g77 -vt:inst compinst bar.F -o bar.o" << std::endl + << " vtf77 -vt:f77 g77 -vt:inst compinst foo.o bar.o -o foo" << std::endl + << std::endl + << " manually instrumentation by using VT's API:" << std::endl + << std::endl + << " vtf77 -vt:inst manual foobar.F -o foobar -DVTRACE"; + break; + case LANG_F90: + std::cout << " vtf90 -vt:f90 gfortran -vt:inst compinst -c foo.F90 -o foo.o" << std::endl + << " vtf90 -vt:f90 gfortran -vt:inst compinst bar.F90 -o bar.o" << std::endl + << " vtf90 -vt:f90 gfortran -vt:inst compinst foo.o bar.o -o foo" << std::endl + << std::endl + << " manually instrumentation by using VT's API:" << std::endl + << std::endl + << " vtf90 -vt:inst manual foobar.F90 -o foobar -DVTRACE"; + break; + } + + if( Config.fortran() ) + { + std::cout << std::endl << std::endl + << " IMPORTANT: Fortran source files instrumented by using VT's API" << std::endl + << " have to be (CPP) preprocessed."; + } + std::cout << std::endl << std::endl; +} + +int +showOrExecuteCommand( std::string& cmd ) +{ + int rc = 0; + + // remove leading, trailing, and double spaces + trimString( cmd ); + + // either show + if( Config.showme_flags ) + { + std::cout << cmd << std::endl; + } + // or execute command + else + { + if( Config.be_verbose ) + std::cout << "+++ " << cmd << std::endl; + if( ( rc = system( cmd.c_str() ) ) != -1 ) + rc = WEXITSTATUS( rc ); + } + + return rc; +} + +void +getIncFilesFromTabFile( std::vector& incfiles ) +{ + std::ifstream in( Config.opari_tabfile.first.c_str() ); + if( in ) + { + char buffer[1024]; + std::string line; + + while( in.getline( buffer, sizeof( buffer ) ) ) + { + line = buffer; + + if( line.find( "#include" ) != std::string::npos && + line.find( ".opari.inc" ) != std::string::npos ) + { + std::string incfile = line.substr( line.find( "#include" ) + 10 ); + incfile.erase( incfile.length() - 1 ); + + incfiles.push_back( incfile ); + } + } + + in.close(); + } +} + +void +trimString( std::string& str ) +{ + std::string::size_type i, j; + + // remove leading and trailing spaces + // + + i = str.find_first_not_of( " \t" ); + j = str.find_last_not_of( " \t" ); + + if( ( i == std::string::npos ) || ( j == std::string::npos ) ) + str = ""; + else + str = str.substr( i, j - i + 1 ); + + // remove double spaces + // + while( str.length() > 0 && ( i = str.find( " " ) ) != std::string::npos ) + str.erase( i, 1 ); +} + +//////////////////// struct ConfigS //////////////////// + +bool +ConfigS::setLanguage( const LangTypeT lang ) +{ +#if !(defined(HAVE_F77) && HAVE_F77) || !(defined(HAVE_F90) && HAVE_F90) + bool error = false; + std::string str_lang; + + if( lang == LANG_F77 ) + { +# if !(defined(HAVE_F77) && HAVE_F77) + str_lang = "Fortran 77"; + error = true; +# endif // HAVE_F77 + } + else if( lang == LANG_F90 ) + { +# if !(defined(HAVE_F90) && HAVE_F90) + str_lang = "Fortran 90"; + error = true; +# endif // HAVE_F90 + } + + if( !error ) + { + lang_type = lang; + } + else + { + std::cerr << "Unfortunately, this installation of VampirTrace " + << "was not compiled with" << std::endl + << str_lang << " support. As such, the " << ExeName + << " compiler is non-functional." << std::endl; + } + + return !error; +#else // HAVE_F77 || HAVE_F90 + lang_type = lang; + return true; +#endif // HAVE_F77 || HAVE_F90 +} + +bool +ConfigS::fortran() const +{ + return ( lang_type == LANG_F77 || lang_type == LANG_F90 ); +} + +void +ConfigS::setCompilerCmd( const std::string& cmd ) +{ + std::string bcomp = cmd; + std::string::size_type ls = cmd.rfind('/'); + + if( ls != std::string::npos ) bcomp = cmd.substr( ls+1 ); + + if( !uses_mpi && + ( bcomp.compare( 0, 2, "mp" ) == 0 || + bcomp.compare( 0, 4, "sxmp" ) == 0 || + bcomp.compare( 0, 4, "scmp" ) == 0 ) ) + { + setUsesMpi( true ); + } + + if( bcomp.compare( 0, 3, "xlf" ) == 0 || + bcomp.compare( 0, 9, "blrts_xlf" ) == 0 || + bcomp.compare( 0, 3, "bgf" ) == 0 ) + { + comp_fdflag = "-WF,-D"; + } + else + { + comp_fdflag = "-D"; + } + + comp_cmd = cmd; +} + +void +ConfigS::addCompilerArg( const std::string& arg ) +{ + if( comp_args.length() > 0 ) comp_args += " "; + comp_args += arg; +} + +void +ConfigS::addCompilerLib( const std::string& lib ) +{ + if( comp_libs.length() > 0 ) comp_libs += " "; + comp_libs += lib; +} + +void +ConfigS::addModSrcFile( const std::string& file ) +{ + std::string file_base; + std::string file_obj; + std::string::size_type si; + + // get base name of source file + // + file_base = file; + si = file.rfind( '/' ); + if( si != std::string::npos ) + file_base = file.substr( si+1 ); + + // create object file name of source file + // + si = file_base.rfind( '.' ); + assert( si != std::string::npos ); + file_obj = file_base.substr( 0, si ) + ".o"; + + // store source/object file name for later processing by OPARI and/or TAU + mod_files.push_back( std::make_pair( file, file_obj ) ); + + // add (modified) source file name to compiler arguments + // + + std::string mod_file = file; + + si = mod_file.rfind( '.' ); + assert( si != std::string::npos ); + + if( inst_type == INST_TYPE_TAUINST ) + mod_file.insert( si, ".tau" ); + else + mod_file.insert( si, ".mod" ); + + // convert Fortran source file suffix to upper case, in order to + // invoke the C preprocessor before compiling + // + if( fortran() ) + { + si = mod_file.rfind( ".f" ); + if( si != std::string::npos ) mod_file.replace( si, 2, ".F" ); + } + + addCompilerArg( mod_file ); +} + +void +ConfigS::setOpariTabFile( const std::string& file ) +{ + std::string file_src; + std::string file_obj; + + if( !( file.length() >= 2 && + file.compare( file.length()-2, 2, ".c" ) == 0 ) ) + { + file_src = file + ".c"; + file_obj = file + ".o"; + } + else + { + file_src = file_obj = file; + file_obj.replace( file.length()-2, 2, ".o" ); + } + + opari_tabfile = std::make_pair( file_src, file_obj ); +} + +void +ConfigS::setOpariRcFile( const std::string& file ) +{ + opari_rcfile = file; + opari_keep_rcfile = true; +} + +void +ConfigS::addOpariArg( const std::string& arg ) +{ + if( opari_args.length() > 0 ) opari_args += " "; + opari_args += arg; +} + +void +ConfigS::addTauinstArg( const std::string& arg ) +{ + if( tauinst_args.length() > 0 ) tauinst_args += " "; + tauinst_args += arg; +} + +void +ConfigS::addTauinstParseArg( const std::string& arg ) +{ + if( tauinst_parseargs.length() > 0 ) tauinst_parseargs += " "; + tauinst_parseargs += arg; +} + +void +ConfigS::setUsesMpi( const bool set, const bool ovwrt ) +{ + static bool first = true; + + if( first || ovwrt ) + { + if( set ) + { #if !(defined(HAVE_MPI) && HAVE_MPI) - std::cerr << "Unfortunately, this installation of VampirTrace was not " - << "compiled with" << std::endl - << "MPI support." << std::endl; - exit(1); + std::cerr << "Unfortunately, this installation of VampirTrace was not " + << "compiled with" << std::endl + << "MPI support." << std::endl; + exit(1); #else // HAVE_MPI - if( m_eLangType == LANG_F77 || m_eLangType == LANG_F90 ) - { + if( fortran() ) + { # if !(defined(HAVE_FMPI) && HAVE_FMPI) - std::cerr << "Unfortunately, this installation of VampirTrace was " - << "not compiled with" << std::endl - << "MPI Fortran support." << std::endl; - exit(1); + std::cerr << "Unfortunately, this installation of VampirTrace was " + << "not compiled with" << std::endl + << "MPI Fortran support." << std::endl; + exit(1); # endif // WRAP_FMPI - } -#endif // HAVE_MPI } +#endif // HAVE_MPI + } - first = false; - m_bUsesMpi = set; - } + first = false; + uses_mpi = set; + } } void -Config::setUsesThreads( const bool set, const bool ovwrt ) +ConfigS::setUsesThreads( const bool set, const bool ovwrt ) { - static bool first = true; + static bool first = true; - if( first || ovwrt ) - { + if( first || ovwrt ) + { #if !(defined(HAVE_THREADS) && HAVE_THREADS) - if( set ) - { - std::cerr << "Unfortunately, this installation of VampirTrace was not " - << "compiled with" << std::endl - << "Multithreading support." << std::endl; - exit(1); - } + if( set ) + { + std::cerr << "Unfortunately, this installation of VampirTrace was not " + << "compiled with" << std::endl + << "Multithreading support." << std::endl; + exit(1); + } #endif // HAVE_THREADS - first = false; - m_bUsesThreads = set; - } + first = false; + uses_threads = set; + } } void -Config::setUsesOpenMP( const bool set, const bool ovwrt ) +ConfigS::setUsesOpenMP( const bool set, const bool ovwrt ) { - static bool first = true; + static bool first = true; - if( first || ovwrt ) - { + if( first || ovwrt ) + { #if !(defined(HAVE_OMP) && HAVE_OMP) - if( set ) - { - std::cerr << "Unfortunately, this installation of VampirTrace was not " - << "compiled with" << std::endl - << "OpenMP support." << std::endl; - exit(1); - } + if( set ) + { + std::cerr << "Unfortunately, this installation of VampirTrace was not " + << "compiled with" << std::endl + << "OpenMP support." << std::endl; + exit(1); + } #endif // HAVE_OMP - first = false; - m_bUsesOpenMP = set; - } + first = false; + uses_openmp = set; + } } bool -Config::setInstAvail( const std::string type ) +ConfigS::setInstAvail( const std::string& type ) { - if( type.compare( "compinst" ) == 0 ) - setInstAvail( INST_TYPE_COMPINST ); - else if( type.compare( "dyninst" ) == 0 ) - setInstAvail( INST_TYPE_DYNINST ); - else if( type.compare( "tauinst" ) == 0 ) - setInstAvail( INST_TYPE_TAUINST ); - else if( type.compare( "manual" ) == 0 ) - setInstAvail( INST_TYPE_MANUAL ); - else - return false; + if( type.compare( "compinst" ) == 0 ) + inst_avail |= INST_TYPE_COMPINST; + else if( type.compare( "dyninst" ) == 0 ) + inst_avail |= INST_TYPE_DYNINST; + else if( type.compare( "tauinst" ) == 0 ) + inst_avail |= INST_TYPE_TAUINST; + else if( type.compare( "manual" ) == 0 ) + inst_avail |= INST_TYPE_MANUAL; + else + return false; - return true; + return true; } bool -Config::setInstType( const InstTypeT type ) +ConfigS::setInstType( const InstTypeT type ) { - assert( m_iInstAvail != 0 ); + assert( inst_avail != 0 ); - // instrumentation available ? - if( !isInstAvail( type ) ) - return false; + // instrumentation available ? + if( !isInstAvail( type ) ) + return false; - m_eInstType = type; + inst_type = type; - if( type == INST_TYPE_COMPINST ) - m_sComp_InstFlags = m_sCompInst_Flags; - else if( type == INST_TYPE_DYNINST ) - m_sComp_InstFlags = m_sDynInst_Flags; - else - m_sComp_InstFlags = ""; + if( type == INST_TYPE_COMPINST ) + comp_instflags = compinst_flags; + else if( type == INST_TYPE_DYNINST ) + comp_instflags = dyninst_flags; + else + comp_instflags = ""; - return true; + return true; } bool -Config::setInstType( const std::string type ) +ConfigS::setInstType( const std::string& type ) { - if( type.compare( "compinst" ) == 0 ) - return setInstType( INST_TYPE_COMPINST ); - else if( type.compare( "dyninst" ) == 0 ) - return setInstType( INST_TYPE_DYNINST ); - else if( type.compare( "tauinst" ) == 0 ) - return setInstType( INST_TYPE_TAUINST ); - else if( type.compare( "manual" ) == 0 ) - return setInstType( INST_TYPE_MANUAL ); - else - return false; + if( type.compare( "compinst" ) == 0 ) + return setInstType( INST_TYPE_COMPINST ); + else if( type.compare( "dyninst" ) == 0 ) + return setInstType( INST_TYPE_DYNINST ); + else if( type.compare( "tauinst" ) == 0 ) + return setInstType( INST_TYPE_TAUINST ); + else if( type.compare( "manual" ) == 0 ) + return setInstType( INST_TYPE_MANUAL ); + else + return false; +} + +bool +ConfigS::isInstAvail( const InstTypeT type ) const +{ + return ( inst_avail & type ); } diff --git a/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.h b/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.h deleted file mode 100644 index 698c8f5b08..0000000000 --- a/ompi/contrib/vt/vt/tools/vtwrapper/vt_wrapper.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * VampirTrace - * http://www.tu-dresden.de/zih/vampirtrace - * - * Copyright (c) 2005-2011, ZIH, TU Dresden, Federal Republic of Germany - * - * Copyright (c) 1998-2005, Forschungszentrum Juelich, Juelich Supercomputing - * Centre, Federal Republic of Germany - * - * See the file COPYING in the package base directory for details - **/ - -#ifndef _VT_WRAPPER_H_ -#define _VT_WRAPPER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "vt_inttypes.h" - -#include "util/installdirs.h" - -// languages types -// -typedef enum { LANG_CC, LANG_CXX, LANG_F77, LANG_F90 } LangTypeT; - -// instrumentation types -// -typedef enum { INST_TYPE_COMPINST = 0x1, // auto. instr. by compiler - INST_TYPE_MANUAL = 0x2, // manual instr. by VT API - INST_TYPE_DYNINST = 0x4, // binary instrumentation by Dyninst - INST_TYPE_TAUINST = 0x8 // auto. source code instr. by TAU -} InstTypeT; - -// -// Wrapper class -// -class Config; -class Wrapper -{ -public: - - // contructor - Wrapper(); - - // destructor - ~Wrapper(); - - bool readDataFile( void ); - bool readEnvironmentVars( void ); - bool parseCommandLine( int argc, char ** argv ); - int run( void ); - -private: - - void showVersion( void ); - void showUsageText( void ); - - int executeOrShowCommand( std::string & cmd ); - std::vector getIncFilesFromTabFile( void ); - - Config * m_pConfig; - -}; - -// -// Config class -// -class Config -{ - friend class Wrapper; - -public: - - // contructor - Config(); - - // destructor - ~Config(); - - bool setLanguage( const LangTypeT lang ); - - void compiler_setCmd( const std::string cmd ); - void compiler_addArg( const std::string arg ); - void compiler_addLib( const std::string lib ); - void compiler_addSrcFile( const std::string file ); - - void opari_setRcFile( const std::string file ); - void opari_setTabFile( const std::string file ); - void opari_addArg( const std::string arg ); - - void tauinst_addArg( const std::string arg ); - void tauinst_addParseArg( const std::string arg ); - - void setUsesMpi( const bool set, const bool ovwrt = false ); - void setUsesThreads( const bool set, const bool ovwrt = false ); - void setUsesOpenMP( const bool set, const bool ovwrt = false ); - - void setInstAvail( const InstTypeT type ) { - m_iInstAvail |= type; } - bool setInstAvail( const std::string type ); - bool isInstAvail( InstTypeT type ) { - return (m_iInstAvail & type); } - bool setInstType( const InstTypeT type ); - bool setInstType( const std::string type ); - -protected: - - std::string m_sVT_Version; // VT version - - std::string m_sVT_IncDir; // VT's include directory - std::string m_sVT_LibDir; // VT's library directory - - std::string m_sVT_SeqLib; // VT-library for sequential programs - std::string m_sVT_MpiLib; // VT-library for MPI programs - std::string m_sVT_MtLib; // VT-library for multithreading programs - std::string m_sVT_HybLib; // VT-library for hybrid (MPI/Threads) - // programs - std::string m_sVT_PompLib; // VT's POMP library - std::string m_sVT_DynAttLib; // VT's Dyninst attach library - - std::string m_sComp_CmdEnv; // compiler command env. name - std::string m_sComp_FlagsEnv; // compiler flags env. name - std::string m_sComp_Cmd; // compiler command - std::string m_sComp_Args; // compiler arguments - std::string m_sComp_Flags; // compiler flags - std::string m_sComp_LdFlags; // linker flags - std::string m_sComp_FDFlag; // flag to define preprocessor macro - std::string m_sComp_InstFlags; // compiler instrumentation flags - std::string m_sComp_Libs; // libraries to link - std::vector - m_vecComp_SrcFiles; // compiler input source files - std::vector - m_vecComp_ObjFiles; // compiler output object files - - std::string m_sOpari_Cmd; // OPARI command - std::string m_sOpari_Args; // OPARI arguments - std::string m_sOpari_RcFile; // OPARI's rc file - std::pair - m_sOpari_TabFile; // OPARI's table source file - std::string m_sOpari_TabCompCmd; // compiler command for OPARI's table file - std::string m_sOpari_TabCompFlags; // compiler flags for OPARI's table file - - std::string m_sCompInst_Flags; // compiler flags to enable instrumentation - std::string m_sDynInst_Flags; // compiler flags to produce debugging information - // (needed for binary instrumentation by Dyninst) - - std::string m_sTauInst_Cmd; // TAU instrumentor command - std::string m_sTauInst_Args; // TAU instrumentor arguments - std::string m_sTauInst_ParseCmd; // PDT source code parser command - std::string m_sTauInst_ParseArgs; // PDT parser arguments - - LangTypeT m_eLangType; // language type - InstTypeT m_eInstType; // instrumentation type - // (e.g. compinst,manual,...) - int m_iInstAvail; // bitmask for available instr.-types - bool m_bBeVerbose; // FLAG: be verbose ? - bool m_bCompOnly; // FLAG: compile only ? - bool m_bOutfileGiven; // FLAG: output file given ? - bool m_bUsesMpi; // FLAG: uses MPI ? - bool m_bUsesThreads; // FLAG: uses Threads ? - bool m_bUsesOpenMP; // FLAG: uses OpenMP ? (use OPARI) - bool m_bKeepOpariRcFile; // FLAG: don't delete OPARI's rc file ? - bool m_bShow; // FLAG: show compiler/linker flags ? - -}; - -#endif // _VT_WRAPPER_H_