@@ -45,11 +45,14 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
45
45
ArgStringList UpperCmdArgs;
46
46
ArgStringList LowerCmdArgs;
47
47
SmallString<256 > Stem;
48
+ SmallString<256 > Path;
48
49
std::string OutFile;
49
50
bool NeedIEEE = false ;
50
51
bool NeedFastMath = false ;
51
52
bool NeedRelaxedMath = false ;
52
53
54
+ bool IsOpenMPDevice = JA.isDeviceOffloading (Action::OFK_OpenMP);
55
+
53
56
// Check number of inputs for sanity. We need at least one input.
54
57
assert (Inputs.size () >= 1 && " Must have at least one input." );
55
58
@@ -792,6 +795,22 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
792
795
UpperCmdArgs.push_back (" -output" );
793
796
UpperCmdArgs.push_back (ILMFile);
794
797
798
+ if (Args.getAllArgValues (options::OPT_fopenmp_targets_EQ).size () > 0 ) {
799
+ SmallString<128 > TargetInfo;
800
+ Path = llvm::sys::path::parent_path (Output.getFilename ());
801
+ Arg* Tgts = Args.getLastArg (options::OPT_fopenmp_targets_EQ);
802
+ assert (Tgts && Tgts->getNumValues () &&
803
+ " OpenMP offloading has to have targets specified." );
804
+ for (unsigned i = 0 ; i < Tgts->getNumValues (); ++i) {
805
+ if (i)
806
+ TargetInfo += ' ,' ;
807
+ llvm::Triple T (Tgts->getValue (i));
808
+ TargetInfo += T.getTriple ();
809
+ }
810
+ UpperCmdArgs.push_back (" -fopenmp-targets" );
811
+ UpperCmdArgs.push_back (Args.MakeArgString (TargetInfo.str ()));
812
+ }
813
+
795
814
C.addCommand (llvm::make_unique<Command>(JA, *this , UpperExec, UpperCmdArgs, Inputs));
796
815
797
816
// For -fsyntax-only or -E that is it
@@ -899,7 +918,48 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
899
918
LowerCmdArgs.push_back (" -stbfile" );
900
919
LowerCmdArgs.push_back (STBFile);
901
920
902
- LowerCmdArgs.push_back (" -asm" ); LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
921
+
922
+ /* OpenMP GPU Offload */
923
+ if (Args.getAllArgValues (options::OPT_fopenmp_targets_EQ).size () > 0 ) {
924
+ SmallString<128 > TargetInfo;// ("-fopenmp-targets ");
925
+ SmallString<256 > TargetInfoAsm;// ("-fopenmp-targets-asm ");
926
+ Path = llvm::sys::path::parent_path (Output.getFilename ());
927
+
928
+ Arg* Tgts = Args.getLastArg (options::OPT_fopenmp_targets_EQ);
929
+ assert (Tgts && Tgts->getNumValues () &&
930
+ " OpenMP offloading has to have targets specified." );
931
+ for (unsigned i = 0 ; i != Tgts->getNumValues (); ++i) {
932
+ if (i)
933
+ TargetInfo += ' ,' ;
934
+ // We need to get the string from the triple because it may not be exactly
935
+ // the same as the one we get directly from the arguments.
936
+ llvm::Triple T (Tgts->getValue (i));
937
+ TargetInfo += T.getTriple ();
938
+ // We also need to give a output file
939
+ TargetInfoAsm += Path;
940
+ TargetInfoAsm += " /" ;
941
+ TargetInfoAsm += Stem;
942
+ TargetInfoAsm += " -" ;
943
+ TargetInfoAsm += T.getTriple ();
944
+ TargetInfoAsm += " .ll" ;
945
+ }
946
+ LowerCmdArgs.push_back (" -fopenmp-targets" );
947
+ LowerCmdArgs.push_back (Args.MakeArgString (TargetInfo.str ()));
948
+ if (IsOpenMPDevice) {
949
+ LowerCmdArgs.push_back (" -fopenmp-targets-asm" );
950
+ LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
951
+ LowerCmdArgs.push_back (" -asm" );
952
+ LowerCmdArgs.push_back (Args.MakeArgString (TargetInfoAsm.str ()));
953
+ } else {
954
+ LowerCmdArgs.push_back (" -fopenmp-targets-asm" );
955
+ LowerCmdArgs.push_back (Args.MakeArgString (TargetInfoAsm.str ()));
956
+ LowerCmdArgs.push_back (" -asm" );
957
+ LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
958
+ }
959
+ } else {
960
+ LowerCmdArgs.push_back (" -asm" );
961
+ LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
962
+ }
903
963
904
964
C.addCommand (llvm::make_unique<Command>(JA, *this , LowerExec, LowerCmdArgs, Inputs));
905
965
}
0 commit comments