================
@@ -187,84 +189,67 @@ static Error executeCommands(StringRef ExecutablePath,
return Error::success();
}
-static Expected<SmallVector<std::string>> getInput(const ArgList &Args) {
- // Collect all input bitcode files to be passed to the linking stage.
- SmallVector<std::string> BitcodeFiles;
- auto Inputs = Args.filtered(OPT_INPUT);
- if (Inputs.empty())
- return createStringError("No input files provided");
- for (const opt::Arg *Arg : Inputs) {
- StringRef Filename = Arg->getValue();
- if (!sys::fs::exists(Filename) || sys::fs::is_directory(Filename))
- return createStringError("Input file '" + Filename + "' does not exist");
- file_magic Magic;
- if (auto EC = identify_magic(Filename, Magic))
- return createStringError("Failed to open file " + Filename);
- // TODO: Current use case involves LLVM IR bitcode files as input.
- // This will be extended to support SPIR-V IR files.
- if (Magic != file_magic::bitcode)
- return createStringError("Unsupported file type for '" + Filename + "'");
- BitcodeFiles.push_back(std::string(Filename));
- }
- return BitcodeFiles;
-}
-
-/// Handle cases where input file is a LLVM IR bitcode file.
-/// When clang-sycl-linker is called via clang-linker-wrapper tool, input files
-/// are LLVM IR bitcode files.
-// TODO: Support SPIR-V IR files.
-static Expected<std::unique_ptr<Module>> getBitcodeModule(StringRef File,
- LLVMContext &C) {
- SMDiagnostic Err;
-
- auto M = getLazyIRFileModule(File, Err, C);
- if (M)
- return std::move(M);
- return createStringError(Err.getMessage());
-}
+static Expected<SmallVector<std::unique_ptr<MemoryBuffer>>>
+getInput(const ArgList &Args) {
+ // Build input descriptors for the shared archive resolver
+ SmallVector<offloading::InputDesc> InputDescs;
+ bool WholeArchive = false;
+ for (const opt::Arg *Arg : Args.filtered(
+ OPT_INPUT, OPT_library, OPT_whole_archive, OPT_no_whole_archive)) {
+ if (Arg->getOption().matches(OPT_whole_archive) ||
+ Arg->getOption().matches(OPT_no_whole_archive)) {
+ WholeArchive = Arg->getOption().matches(OPT_whole_archive);
+ continue;
+ }
-static std::optional<std::string> findFile(StringRef Dir, const Twine &Name) {
- SmallString<128> Path(Dir);
- llvm::sys::path::append(Path, Name);
- if (sys::fs::exists(Path) && !sys::fs::is_directory(Path))
- return std::string(Path);
- return std::nullopt;
-}
+ offloading::InputDesc Desc;
+ Desc.Value = Arg->getValue();
+ Desc.InputKind = Arg->getOption().matches(OPT_library)
+ ? offloading::InputDesc::Kind::Library
+ : offloading::InputDesc::Kind::File;
+ Desc.WholeArchive = WholeArchive;
+
+ // Validate positional file inputs exist before passing to
+ // resolveArchiveMembers (which silently skips non-existent paths)
+ if (Desc.InputKind == offloading::InputDesc::Kind::File) {
+ if (!sys::fs::exists(Desc.Value))
+ return createStringError("input file not found: '" + Desc.Value + "'");
+ if (sys::fs::is_directory(Desc.Value))
+ return createStringError("'" + Desc.Value + "': Is a directory");
+ }
-static std::optional<std::string>
-searchLibrary(StringRef Name, ArrayRef<StringRef> SearchPaths) {
- // An absolute path is taken as-is; -L paths are only consulted for relative
- // names.
- if (sys::path::is_absolute(Name)) {
- if (sys::fs::exists(Name) && !sys::fs::is_directory(Name))
- return std::string(Name);
- return std::nullopt;
+ InputDescs.push_back(Desc);
}
- for (StringRef Dir : SearchPaths)
- if (std::optional<std::string> File = findFile(Dir, Name))
- return File;
- return std::nullopt;
-}
-/// Gather all library files. The list of files and its location are passed
from
-/// driver.
-static Expected<SmallVector<std::string>>
-getBCLibraryNames(const ArgList &Args) {
+ if (InputDescs.empty())
+ return createStringError("No input files provided");
+
+ // Gather search paths and forced undefined symbols
SmallVector<StringRef> LibraryPaths;
for (const opt::Arg *Arg : Args.filtered(OPT_library_path))
LibraryPaths.push_back(Arg->getValue());
- SmallVector<std::string> LibraryFiles;
- for (const opt::Arg *Arg : Args.filtered(OPT_bc_library)) {
- std::optional<std::string> LibName =
- searchLibrary(Arg->getValue(), LibraryPaths);
- if (!LibName)
- return createStringError("'" + Twine(Arg->getValue()) +
- "' library file not found");
- LibraryFiles.push_back(std::move(*LibName));
- }
+ std::vector<std::string> ForcedUndefStorage = Args.getAllArgValues(OPT_u);
+ SmallVector<StringRef> ForcedUndefs(ForcedUndefStorage.begin(),
+ ForcedUndefStorage.end());
+
+ // Build the Inputs structure
+ offloading::Inputs Inputs;
+ Inputs.Order = InputDescs;
+ Inputs.SearchPaths = LibraryPaths;
+ Inputs.ForcedUndefs = ForcedUndefs;
+ Inputs.Root = "";
+
+ // Resolve archive members (no fat binary predicate for SYCL)
----------------
bader wrote:
Removed the comment in c02407ec0710.
https://github.com/llvm/llvm-project/pull/201253
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits