Skip to content

Commit a803bc5

Browse files
committed
OpenMP NVIDIA offload toolchain integration to Flang.
The patch has several purposes. First, it enables OpenMP Offload Toolchain for Flang when "fopenmp-target = " is used. Then, the necessary parameters to create a device code are passed to flang1 and flang2. It also introduces Fortran extensions to the clang-offload-bundler tool because it is being used during unloading.
1 parent 6e8daee commit a803bc5

File tree

4 files changed

+105
-1
lines changed

4 files changed

+105
-1
lines changed

lib/Driver/ToolChains/Cuda.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,3 +830,42 @@ VersionTuple CudaToolChain::computeMSVCVersion(const Driver *D,
830830
const ArgList &Args) const {
831831
return HostTC.computeMSVCVersion(D, Args);
832832
}
833+
834+
static void AddFlangSysIncludeArg(const ArgList &DriverArgs,
835+
ArgStringList &Flang1Args,
836+
ToolChain::path_list IncludePathList) {
837+
std::string ArgValue; // Path argument value
838+
839+
// Make up argument value consisting of paths separated by colons
840+
bool first = true;
841+
for (auto P : IncludePathList) {
842+
if (first) {
843+
first = false;
844+
} else {
845+
ArgValue += ":";
846+
}
847+
ArgValue += P;
848+
}
849+
850+
// Add the argument
851+
Flang1Args.push_back("-stdinc");
852+
Flang1Args.push_back(DriverArgs.MakeArgString(ArgValue));
853+
}
854+
855+
void CudaToolChain::AddFlangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
856+
llvm::opt::ArgStringList &Flang1Args) const {
857+
path_list IncludePathList;
858+
const Driver &D = getDriver();
859+
860+
861+
if (DriverArgs.hasArg(options::OPT_nostdinc))
862+
return;
863+
864+
{
865+
SmallString<128> P(D.InstalledDir);
866+
llvm::sys::path::append(P, "../include");
867+
IncludePathList.push_back(P.str());
868+
}
869+
870+
AddFlangSysIncludeArg(DriverArgs, Flang1Args, IncludePathList);
871+
}

lib/Driver/ToolChains/Cuda.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ class LLVM_LIBRARY_VISIBILITY CudaToolChain : public ToolChain {
186186
const ToolChain &HostTC;
187187
CudaInstallationDetector CudaInstallation;
188188

189+
void
190+
AddFlangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
191+
llvm::opt::ArgStringList &Flang1Args) const override;
189192
protected:
190193
Tool *buildAssembler() const override; // ptxas
191194
Tool *buildLinker() const override; // fatbinary (ok, not really a linker)

lib/Driver/ToolChains/Flang.cpp

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ 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;
@@ -53,6 +54,8 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
5354
// Check number of inputs for sanity. We need at least one input.
5455
assert(Inputs.size() >= 1 && "Must have at least one input.");
5556

57+
bool IsOpenMPDevice = JA.isDeviceOffloading(Action::OFK_OpenMP);
58+
5659
/***** Process file arguments to both parts *****/
5760
const InputInfo &Input = Inputs[0];
5861
types::ID InputType = Input.getType();
@@ -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+
/* OpenMP GPU Offload */
922+
if(Args.getAllArgValues(options::OPT_fopenmp_targets_EQ).size() > 0) {
923+
//if (isa<CompileJobAction>(JA) && JA.isHostOffloading(Action::OFK_OpenMP)) {
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 be not 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
}

tools/clang-offload-bundler/ClangOffloadBundler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,8 @@ static FileHandler *CreateFileHandler(MemoryBuffer &FirstInput) {
742742
return new TextFileHandler(/*Comment=*/"//");
743743
if (FilesType == "ll")
744744
return new TextFileHandler(/*Comment=*/";");
745+
if (FilesType == "f95")
746+
return new TextFileHandler(/*Comment=*/"!");
745747
if (FilesType == "bc")
746748
return new BinaryFileHandler();
747749
if (FilesType == "s")

0 commit comments

Comments
 (0)