;
32#if defined(_WIN32) || defined(_WIN64) 33#define NULL_FILE "nul" 35#define NULL_FILE "/dev/null" 39const unsignedHIPCodeObjectAlign = 4096;
45 returnHasTargetID ? (
T.getArchName() +
"-"+
T.getVendorName() +
"-"+
46 T.getOSName() +
"-"+
T.getEnvironmentName())
56 constllvm::opt::ArgList &Args_)
58DiagID(C.getDriver().getDiags().getCustomDiagID(
60 "Error collecting HIP undefined fatbin symbols: %0")),
61Quiet(C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)),
62Verbose(C.getArgs().hasArg(options::OPT_v)) {
66 for(
const auto&Name : FatBinSymbols)
67llvm::errs() <<
"Found undefined HIP fatbin symbol: "<< Name <<
"\n";
68 for(
const auto&Name : GPUBinHandleSymbols)
69llvm::errs() <<
"Found undefined HIP gpubin handle symbol: "<< Name
79 returnGPUBinHandleSymbols;
88 boolIsMSVC = Triple.isWindowsMSVCEnvironment();
89llvm::StringRef Ext = IsMSVC ?
".lib":
".a";
91 for(
const auto*Arg : Args.filtered(options::OPT_l)) {
92llvm::StringRef
Value= Arg->getValue();
93 if(
Value.starts_with(
":"))
94ExactLibNames.push_back(
Value.drop_front());
96LibNames.push_back(
Value);
98 for(
const auto*Arg : Args.filtered(options::OPT_L)) {
99 auto Path= Arg->getValue();
100LibPaths.push_back(
Path);
102llvm::errs() <<
"HIP fatbin symbol search uses library path: "<<
Path 106 autoProcessLib = [&](llvm::StringRef LibName,
boolIsExact) {
108IsExact ? Twine(LibName).str()
109: IsMSVC ? (Twine(LibName) + Ext).str()
110: (Twine(
"lib") + LibName + Ext).str());
113 for(
const auto Path: LibPaths) {
115llvm::sys::path::append(FullPath, FullLibName);
117 if(llvm::sys::fs::exists(FullPath)) {
119llvm::errs() <<
"HIP fatbin symbol search found library: " 120<< FullPath <<
"\n";
121 autoBufferOrErr = llvm::MemoryBuffer::getFile(FullPath);
123errorHandler(llvm::errorCodeToError(BufferOrErr.getError()));
126processInput(BufferOrErr.get()->getMemBufferRef());
131 if(!
Found&& Verbose)
132llvm::errs() <<
"HIP fatbin symbol search could not find library: " 133<< FullLibName <<
"\n";
136 for(
const autoLibName : ExactLibNames)
137ProcessLib(LibName,
true);
139 for(
const autoLibName : LibNames)
140ProcessLib(LibName,
false);
145 constllvm::opt::ArgList &Args;
149std::set<std::string> FatBinSymbols;
150std::set<std::string> GPUBinHandleSymbols;
151std::set<std::string, std::less<>> DefinedFatBinSymbols;
152std::set<std::string, std::less<>> DefinedGPUBinHandleSymbols;
153 conststd::string FatBinPrefix =
"__hip_fatbin";
154 conststd::string GPUBinHandlePrefix =
"__hip_gpubin_handle";
156 voidpopulateSymbols() {
157std::deque<const Action *> WorkList;
158std::set<const Action *>
Visited;
160 for(
const auto&
Action: C.getActions())
161WorkList.push_back(
Action);
163 while(!WorkList.empty()) {
164 const Action*CurrentAction = WorkList.front();
165WorkList.pop_front();
167 if(!CurrentAction || !
Visited.insert(CurrentAction).second)
170 if(
const auto*IA = dyn_cast<InputAction>(CurrentAction)) {
171std::string ID = IA->getId().str();
173ID = llvm::utohexstr(llvm::MD5Hash(ID),
true);
174FatBinSymbols.insert((FatBinPrefix + Twine(
'_') + ID).str());
175GPUBinHandleSymbols.insert(
176(GPUBinHandlePrefix + Twine(
'_') + ID).str());
179 if(IA->getInputArg().getNumValues() == 0)
181 const char*
Filename= IA->getInputArg().getValue();
184 autoBufferOrErr = llvm::MemoryBuffer::getFile(
Filename);
191processInput(BufferOrErr.get()->getMemBufferRef());
193WorkList.insert(WorkList.end(), CurrentAction->
getInputs().begin(),
198 voidprocessInput(
constllvm::MemoryBufferRef &Buffer) {
200 autoObjFileOrErr = llvm::object::ObjectFile::createObjectFile(Buffer);
202processSymbols(**ObjFileOrErr);
207llvm::consumeError(ObjFileOrErr.takeError());
208 autoArchiveOrErr = llvm::object::Archive::create(Buffer);
210llvm::Error Err = llvm::Error::success();
211llvm::object::Archive &Archive = *ArchiveOrErr.get();
212 for(
auto&Child : Archive.children(Err)) {
213 autoChildBufOrErr = Child.getMemoryBufferRef();
215processInput(*ChildBufOrErr);
217errorHandler(ChildBufOrErr.takeError());
221errorHandler(std::move(Err));
226llvm::consumeError(ArchiveOrErr.takeError());
229 voidprocessSymbols(
constllvm::object::ObjectFile &Obj) {
230 for(
const auto&Symbol : Obj.symbols()) {
231 autoFlagOrErr = Symbol.getFlags();
233errorHandler(FlagOrErr.takeError());
237 autoNameOrErr = Symbol.getName();
239errorHandler(NameOrErr.takeError());
242llvm::StringRef Name = *NameOrErr;
245FlagOrErr.get() & llvm::object::SymbolRef::SF_Undefined;
246 boolisFatBinSymbol = Name.starts_with(FatBinPrefix);
247 boolisGPUBinHandleSymbol = Name.starts_with(GPUBinHandlePrefix);
251 if(isFatBinSymbol) {
252DefinedFatBinSymbols.insert(Name.str());
253FatBinSymbols.erase(Name.str());
254}
else if(isGPUBinHandleSymbol) {
255DefinedGPUBinHandleSymbols.insert(Name.str());
256GPUBinHandleSymbols.erase(Name.str());
262 if(isFatBinSymbol &&
263DefinedFatBinSymbols.find(Name) == DefinedFatBinSymbols.end())
264FatBinSymbols.insert(Name.str());
265 else if(isGPUBinHandleSymbol && DefinedGPUBinHandleSymbols.find(Name) ==
266DefinedGPUBinHandleSymbols.end())
267GPUBinHandleSymbols.insert(Name.str());
271 voiderrorHandler(llvm::Error Err) {
274 C.getDriver().Diag(DiagID) << llvm::toString(std::move(Err));
281llvm::StringRef OutputFileName,
283 constllvm::opt::ArgList &Args,
287ArgStringList BundlerArgs;
288BundlerArgs.push_back(Args.MakeArgString(
"-type=o"));
289BundlerArgs.push_back(
290Args.MakeArgString(
"-bundle-align="+ Twine(HIPCodeObjectAlign)));
294std::string BundlerTargetArg =
"-targets=host-x86_64-unknown-linux-gnu";
299std::string OffloadKind =
"hip";
300 auto&TT =
T.getToolChain().getTriple();
302OffloadKind = OffloadKind +
"v4";
303 for(
const auto&II : Inputs) {
304 const auto*A = II.getAction();
305 autoArchStr = llvm::StringRef(A->getOffloadingArch());
306BundlerTargetArg +=
','+ OffloadKind +
'-';
307 if(ArchStr ==
"amdgcnspirv")
312 if(!ArchStr.empty())
313BundlerTargetArg +=
'-'+ ArchStr.str();
315BundlerArgs.push_back(Args.MakeArgString(BundlerTargetArg));
318std::string BundlerInputArg =
"-input=" NULL_FILE;
319BundlerArgs.push_back(Args.MakeArgString(BundlerInputArg));
320 for(
const auto&II : Inputs) {
321BundlerInputArg = std::string(
"-input=") + II.getFilename();
322BundlerArgs.push_back(Args.MakeArgString(BundlerInputArg));
325std::string Output = std::string(OutputFileName);
326 auto*BundlerOutputArg =
327Args.MakeArgString(std::string(
"-output=").append(Output));
328BundlerArgs.push_back(BundlerOutputArg);
332 const char*Bundler = Args.MakeArgString(
333 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
334 C.addCommand(std::make_unique<Command>(
336 InputInfo(&JA, Args.MakeArgString(Output))));
347std::string Name = std::string(llvm::sys::path::stem(Output.
getFilename()));
352 const char*ObjinFile;
353 const char*BundleFile;
354 if(
D.isSaveTempsEnabled()) {
355ObjinFile =
C.getArgs().MakeArgString(Name +
".mcin");
356BundleFile =
C.getArgs().MakeArgString(Name +
".hipfb");
358 autoTmpNameMcin =
D.GetTemporaryPath(Name,
"mcin");
359ObjinFile =
C.addTempFile(
C.getArgs().MakeArgString(TmpNameMcin));
360 autoTmpNameFb =
D.GetTemporaryPath(Name,
"hipfb");
361BundleFile =
C.addTempFile(
C.getArgs().MakeArgString(TmpNameFb));
366std::string ObjBuffer;
367llvm::raw_string_ostream ObjStream(ObjBuffer);
374std::string PrimaryHipFatbinSymbol;
375std::string PrimaryGpuBinHandleSymbol;
376 boolFoundPrimaryHipFatbinSymbol =
false;
377 boolFoundPrimaryGpuBinHandleSymbol =
false;
379std::vector<std::string> AliasHipFatbinSymbols;
380std::vector<std::string> AliasGpuBinHandleSymbols;
384 for(
const auto&Symbol : Symbols.getFatBinSymbols()) {
385 if(!FoundPrimaryHipFatbinSymbol) {
386PrimaryHipFatbinSymbol = Symbol;
387FoundPrimaryHipFatbinSymbol =
true;
389AliasHipFatbinSymbols.push_back(Symbol);
392 for(
const auto&Symbol : Symbols.getGPUBinHandleSymbols()) {
393 if(!FoundPrimaryGpuBinHandleSymbol) {
394PrimaryGpuBinHandleSymbol = Symbol;
395FoundPrimaryGpuBinHandleSymbol =
true;
397AliasGpuBinHandleSymbols.push_back(Symbol);
404ObjStream <<
"# HIP Object Generator\n";
405ObjStream <<
"# *** Automatically generated by Clang ***\n";
406 if(FoundPrimaryGpuBinHandleSymbol) {
408 if(HostTriple.isWindowsMSVCEnvironment())
409ObjStream <<
" .section .hip_gpubin_handle,\"dw\"\n";
411ObjStream <<
" .protected "<< PrimaryGpuBinHandleSymbol <<
"\n";
412ObjStream <<
" .type "<< PrimaryGpuBinHandleSymbol <<
",@object\n";
413ObjStream <<
" .section .hip_gpubin_handle,\"aw\"\n";
415ObjStream <<
" .globl "<< PrimaryGpuBinHandleSymbol <<
"\n";
416ObjStream <<
" .p2align 3\n";
417ObjStream << PrimaryGpuBinHandleSymbol <<
":\n";
418ObjStream <<
" .zero 8\n";
421 for(
const auto&AliasSymbol : AliasGpuBinHandleSymbols) {
422ObjStream <<
" .globl "<< AliasSymbol <<
"\n";
423ObjStream <<
" .set "<< AliasSymbol <<
","<< PrimaryGpuBinHandleSymbol
427 if(FoundPrimaryHipFatbinSymbol) {
429 if(HostTriple.isWindowsMSVCEnvironment())
430ObjStream <<
" .section .hip_fatbin,\"dw\"\n";
432ObjStream <<
" .protected "<< PrimaryHipFatbinSymbol <<
"\n";
433ObjStream <<
" .type "<< PrimaryHipFatbinSymbol <<
",@object\n";
434ObjStream <<
" .section .hip_fatbin,\"a\",@progbits\n";
436ObjStream <<
" .globl "<< PrimaryHipFatbinSymbol <<
"\n";
437ObjStream <<
" .p2align "<< llvm::Log2(llvm::Align(HIPCodeObjectAlign))
440 for(
const auto&AliasSymbol : AliasHipFatbinSymbols) {
441ObjStream <<
" .globl "<< AliasSymbol <<
"\n";
442ObjStream <<
" .set "<< AliasSymbol <<
","<< PrimaryHipFatbinSymbol
445ObjStream << PrimaryHipFatbinSymbol <<
":\n";
446ObjStream <<
" .incbin ";
447llvm::sys::printArg(ObjStream, BundleFile,
true);
450 if(HostTriple.isOSLinux() && HostTriple.isOSBinFormatELF())
451ObjStream <<
" .section .note.GNU-stack, \"\", @progbits\n";
455 if(
C.getArgs().hasArg(options::OPT_fhip_dump_offload_linker_script))
456llvm::errs() << ObjBuffer;
460llvm::raw_fd_ostream Objf(ObjinFile, EC, llvm::sys::fs::OF_None);
463 D.Diag(clang::diag::err_unable_to_make_temp) << EC.message();
469ArgStringList ClangArgs{
"-target", Args.MakeArgString(HostTriple.normalize()),
474 D.getClangProgramPath(), ClangArgs,
475Inputs, Output,
D.getPrependArg()));
static std::string normalizeForBundler(const llvm::Triple &T, bool HasTargetID)
llvm::DenseSet< const void * > Visited
const std::set< std::string > & getGPUBinHandleSymbols() const
void processStaticLibraries()
HIPUndefinedFatBinSymbols(const Compilation &C, const llvm::opt::ArgList &Args_)
const std::set< std::string > & getFatBinSymbols() const
Concrete class used by the front-end to report problems and issues.
Action - Represent an abstract compilation step to perform.
Compilation - A set of tasks to perform for a single driver invocation.
const Driver & getDriver() const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string getTargetTriple() 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.
const FunctionProtoType * T
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