@@ -45,11 +45,14 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
4545 ArgStringList UpperCmdArgs;
4646 ArgStringList LowerCmdArgs;
4747 SmallString<256 > Stem;
48+ SmallString<256 > Path;
4849 std::string OutFile;
4950 bool NeedIEEE = false ;
5051 bool NeedFastMath = false ;
5152 bool NeedRelaxedMath = false ;
5253
54+ bool IsOpenMPDevice = JA.isDeviceOffloading (Action::OFK_OpenMP);
55+
5356 // Check number of inputs for sanity. We need at least one input.
5457 assert (Inputs.size () >= 1 && " Must have at least one input." );
5558
@@ -792,6 +795,22 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
792795 UpperCmdArgs.push_back (" -output" );
793796 UpperCmdArgs.push_back (ILMFile);
794797
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+
795814 C.addCommand (llvm::make_unique<Command>(JA, *this , UpperExec, UpperCmdArgs, Inputs));
796815
797816 // For -fsyntax-only or -E that is it
@@ -899,7 +918,48 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
899918 LowerCmdArgs.push_back (" -stbfile" );
900919 LowerCmdArgs.push_back (STBFile);
901920
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+ }
903963
904964 C.addCommand (llvm::make_unique<Command>(JA, *this , LowerExec, LowerCmdArgs, Inputs));
905965}
0 commit comments