;
33#if defined(_WIN32) || defined(_WIN64) 34#define NULL_FILE "nul" 36#define NULL_FILE "/dev/null" 39voidAMDGCN::Linker::constructLlvmLinkCommand(
Compilation&
C,
43 constllvm::opt::ArgList &Args)
const{
46ArgStringList LlvmLinkArgs;
48assert(!Inputs.empty() &&
"Must have at least one input.");
50LlvmLinkArgs.append({
"-o", Output.
getFilename()});
51 for(
autoInput : Inputs)
52LlvmLinkArgs.push_back(Input.getFilename());
56 autoTargetID = Args.getLastArgValue(options::OPT_mcpu_EQ);
60 const char*LlvmLink =
61Args.MakeArgString(
getToolChain().GetProgramPath(
"llvm-link"));
63LlvmLink, LlvmLinkArgs, Inputs,
70 constllvm::opt::ArgList &Args)
const{
73ArgStringList LldArgs{
"-flavor",
79 "-plugin-opt=-amdgpu-internalize-symbols"};
80 if(Args.hasArg(options::OPT_hipstdpar))
81LldArgs.push_back(
"-plugin-opt=-amdgpu-enable-hipstdpar");
83 auto&TC = getToolChain();
84 auto&
D= TC.getDriver();
85assert(!Inputs.empty() &&
"Must have at least one input.");
86 boolIsThinLTO =
D.getOffloadLTOMode() ==
LTOK_Thin;
87 addLTOOptions(TC, Args, LldArgs, Output, Inputs[0], IsThinLTO);
90std::vector<llvm::StringRef> Features;
94std::string MAttrString =
"-plugin-opt=-mattr=";
96MAttrString.append(Args.MakeArgString(OneFeature));
97 if(OneFeature != Features.back())
98MAttrString.append(
",");
100 if(!Features.empty())
101LldArgs.push_back(Args.MakeArgString(MAttrString));
107LldArgs.push_back(Args.MakeArgString(
"-plugin-opt=-force-import-all"));
109 for(
constArg *A : Args.filtered(options::OPT_mllvm)) {
111Args.MakeArgString(Twine(
"-plugin-opt=") + A->getValue(0)));
114 if(
C.getDriver().isSaveTempsEnabled())
115LldArgs.push_back(
"-save-temps");
129LldArgs.push_back(
"--whole-archive");
131 for(
auto*Arg : Args.filtered(options::OPT_Xoffload_linker)) {
132StringRef ArgVal = Arg->getValue(1);
133 autoSplitArg = ArgVal.split(
"-mllvm=");
134 if(!SplitArg.second.empty()) {
136Args.MakeArgString(Twine(
"-plugin-opt=") + SplitArg.second));
138LldArgs.push_back(Args.MakeArgString(ArgVal));
144 for(
autoInput : Inputs)
145LldArgs.push_back(Input.getFilename());
149 autoTargetID = Args.getLastArgValue(options::OPT_mcpu_EQ);
153LldArgs.push_back(
"--no-whole-archive");
155 const char*Lld = Args.MakeArgString(getToolChain().GetProgramPath(
"lld"));
157Lld, LldArgs, Inputs, Output));
166voidAMDGCN::Linker::constructLinkAndEmitSpirvCommand(
168 const InputInfo&Output,
constllvm::opt::ArgList &Args)
const{
169assert(!Inputs.empty() &&
"Must have at least one input.");
171constructLlvmLinkCommand(
C, JA, Inputs, Output, Args);
176llvm::opt::ArgStringList TrArgs{
177 "--spirv-max-version=1.6",
179 "--spirv-allow-unknown-intrinsics",
180 "--spirv-lower-const-expr",
181 "--spirv-preserve-auxdata",
182 "--spirv-debug-info-version=nonsemantic-shader-200"};
193 const char*LinkingOutput)
const{
194 if(Inputs.size() > 0 &&
195Inputs[0].getType() == types::TY_Image &&
196JA.
getType() == types::TY_Object)
200 if(JA.
getType() == types::TY_HIP_FATBIN)
204 if(JA.
getType() == types::TY_LLVM_BC)
205 returnconstructLlvmLinkCommand(
C, JA, Inputs, Output, Args);
207 if(getToolChain().getEffectiveTriple().isSPIRV())
208 returnconstructLinkAndEmitSpirvCommand(
C, JA, Inputs, Output, Args);
210 returnconstructLldCommand(
C, JA, Inputs, Output, Args);
214 const ToolChain&HostTC,
constArgList &Args)
221 if(!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
224 for(
auto*A : Args.filtered(options::OPT_fsanitize_EQ)) {
226 if(K != SanitizerKind::Address)
227 D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
228<< A->getAsString(Args) <<
getTriple().str();
233 constllvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
238 "Only HIP offloading kinds are supported for GPUs.");
240CC1Args.append({
"-fcuda-is-device",
"-fno-threadsafe-statics"});
242 if(!DriverArgs.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
244CC1Args.append({
"-mllvm",
"-amdgpu-internalize-symbols"});
245 if(DriverArgs.hasArgNoClaim(options::OPT_hipstdpar))
246CC1Args.append({
"-mllvm",
"-amdgpu-enable-hipstdpar"});
248StringRef MaxThreadsPerBlock =
249DriverArgs.getLastArgValue(options::OPT_gpu_max_threads_per_block_EQ);
250 if(!MaxThreadsPerBlock.empty()) {
252(Twine(
"--gpu-max-threads-per-block=") + MaxThreadsPerBlock).str();
253CC1Args.push_back(DriverArgs.MakeArgStringRef(ArgStr));
256CC1Args.push_back(
"-fcuda-allow-variadic-functions");
260 if(!DriverArgs.hasArg(options::OPT_fvisibility_EQ,
261options::OPT_fvisibility_ms_compat)) {
262CC1Args.append({
"-fvisibility=hidden"});
263CC1Args.push_back(
"-fapply-global-visibility-to-externs");
270 if(!DriverArgs.hasArg(options::OPT_fembed_bitcode_marker))
271CC1Args.push_back(
"-fembed-bitcode=marker");
276CC1Args.push_back(BCFile.ShouldInternalize ?
"-mlink-builtin-bitcode" 277:
"-mlink-bitcode-file");
278CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path));
282llvm::opt::DerivedArgList *
286DerivedArgList *DAL =
289DAL =
newDerivedArgList(Args.getBaseArgs());
293 for(Arg *A : Args) {
298 if(!BoundArch.empty()) {
299DAL->eraseArg(options::OPT_mcpu_EQ);
300DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_mcpu_EQ), BoundArch);
324ArgStringList &CC1Args)
const{
329 constArgList &Args, ArgStringList &CC1Args)
const{
334ArgStringList &CC1Args)
const{
339ArgStringList &CC1Args)
const{
357 constArgList &Args)
const{
364 if(DriverArgs.hasArg(options::OPT_nogpulib) ||
367ArgStringList LibraryPaths;
371LibraryPaths.push_back(DriverArgs.MakeArgString(
Path));
376 autoBCLibArgs = DriverArgs.getAllArgValues(options::OPT_hip_device_lib_EQ);
377 if(!BCLibArgs.empty()) {
378llvm::for_each(BCLibArgs, [&](StringRef BCName) {
380 for(StringRef LibraryPath : LibraryPaths) {
382llvm::sys::path::append(
Path, BCName);
384 if(llvm::sys::fs::exists(
FullName)) {
397assert(!GpuArch.empty() &&
"Must have an explicit GPU arch.");
404BCLibs.emplace_back(N);
408DriverArgs.getLastArgValue(options::OPT_gpu_instrument_lib_EQ);
411 if(llvm::sys::fs::exists(InstLib))
412BCLibs.emplace_back(InstLib);
421 constllvm::opt::ArgList &DriverArgs)
const{
423 if(PTID.OptionalTargetID && !PTID.OptionalGPUArch &&
424PTID.OptionalTargetID !=
"amdgcnspirv")
426<< *PTID.OptionalTargetID;
types::ID getType() const
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
const llvm::opt::OptTable & getOpts() const
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
The JSON file list parser is used to communicate input to InstallAPI.
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4