Skip to content

Commit f90d905

Browse files
authored
Merge pull request #39 from grypp/release_60
OpenMP Offload Toolchain is integrated into Flang.
2 parents dd75873 + b7c9cb2 commit f90d905

File tree

4 files changed

+100
-1
lines changed

4 files changed

+100
-1
lines changed

Diff for: lib/Driver/ToolChains/Cuda.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -670,3 +670,36 @@ VersionTuple CudaToolChain::computeMSVCVersion(const Driver *D,
670670
const ArgList &Args) const {
671671
return HostTC.computeMSVCVersion(D, Args);
672672
}
673+
674+
static void AddFlangSysIncludeArg(const ArgList &DriverArgs,
675+
ArgStringList &Flang1Args,
676+
ToolChain::path_list IncludePathList) {
677+
std::string ArgValue; // Path argument value
678+
679+
// Make up argument value consisting of paths separated by colons
680+
bool first = true;
681+
for (auto P : IncludePathList) {
682+
if (first) {
683+
first = false;
684+
} else {
685+
ArgValue += ":";
686+
}
687+
ArgValue += P;
688+
}
689+
690+
// Add the argument
691+
Flang1Args.push_back("-stdinc");
692+
Flang1Args.push_back(DriverArgs.MakeArgString(ArgValue));
693+
}
694+
695+
void CudaToolChain::AddFlangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
696+
llvm::opt::ArgStringList &Flang1Args) const {
697+
path_list IncludePathList;
698+
const Driver &D = getDriver();
699+
if (DriverArgs.hasArg(options::OPT_nostdinc))
700+
return;
701+
SmallString<128> P(D.InstalledDir);
702+
llvm::sys::path::append(P, "../include");
703+
IncludePathList.push_back(P.str());
704+
AddFlangSysIncludeArg(DriverArgs, Flang1Args, IncludePathList);
705+
}

Diff for: lib/Driver/ToolChains/Cuda.h

+4
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ class LLVM_LIBRARY_VISIBILITY CudaToolChain : public ToolChain {
183183
const ToolChain &HostTC;
184184
CudaInstallationDetector CudaInstallation;
185185

186+
void
187+
AddFlangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
188+
llvm::opt::ArgStringList &Flang1Args) const override;
189+
186190
protected:
187191
Tool *buildAssembler() const override; // ptxas
188192
Tool *buildLinker() const override; // fatbinary (ok, not really a linker)

Diff for: lib/Driver/ToolChains/Flang.cpp

+61-1
Original file line numberDiff line numberDiff line change
@@ -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
}

Diff for: tools/clang-offload-bundler/ClangOffloadBundler.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,8 @@ static FileHandler *CreateFileHandler(MemoryBuffer &FirstInput) {
743743
return new TextFileHandler(/*Comment=*/"//");
744744
if (FilesType == "ll")
745745
return new TextFileHandler(/*Comment=*/";");
746+
if (FilesType == "f95")
747+
return new TextFileHandler(/*Comment=*/"!");
746748
if (FilesType == "bc")
747749
return new BinaryFileHandler();
748750
if (FilesType == "s")

0 commit comments

Comments
 (0)