Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2d50750
remove dummy bin
jinge90 Nov 24, 2025
9c76946
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Nov 26, 2025
fe628a9
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Nov 27, 2025
7a7e62b
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Nov 28, 2025
4de8fa5
merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Dec 1, 2025
e52bb98
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Dec 4, 2025
4b63322
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Dec 10, 2025
544d912
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Dec 12, 2025
2ad6143
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Dec 17, 2025
cf391d9
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Dec 24, 2025
e0f2a15
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Jan 6, 2026
aa7a97c
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Jan 12, 2026
9244680
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Jan 30, 2026
b4b5793
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Feb 3, 2026
50f8f75
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Feb 4, 2026
ebc7166
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Feb 4, 2026
159748c
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Feb 4, 2026
17362e0
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Mar 3, 2026
9e38387
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Mar 5, 2026
dd1e30b
Merge remote-tracking branch 'origin/sycl' into sycl
jinge90 Mar 5, 2026
01fa557
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Mar 25, 2026
78adbd8
Merge remote-tracking branch 'upstream/sycl' into sycl
jinge90 Mar 26, 2026
afcd9df
[SYCL] Use LLVM Linker APIs to link DeviceLib in New offload driver
jinge90 Mar 31, 2026
9063494
sync with latest sycl branch
jinge90 Apr 1, 2026
65040ac
remove extra newline
jinge90 Apr 1, 2026
bfbd2ad
fix clang-format typo
jinge90 Apr 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions clang/tools/clang-linker-wrapper/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ set(LLVM_LINK_COMPONENTS
Support
TargetParser
CodeGen
Linker
LTO
FrontendOffloading
SYCLLowerIR
Expand Down
53 changes: 26 additions & 27 deletions clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/LTO/LTO.h"
#include "llvm/Linker/Linker.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/IRObjectFile.h"
Expand Down Expand Up @@ -1462,45 +1463,43 @@ static Expected<StringRef> linkDeviceInputFiles(ArrayRef<StringRef> InputFiles,
return *OutFileOrErr;
}

/// Link all device library files and input file into one LLVM IR file. This
/// linking is performed using llvm-link tool.
/// 'InputFiles' is the list of all LLVM IR device input files.
/// 'Args' encompasses all arguments required for linking and wrapping device
/// code and will be parsed to generate options required to be passed into the
/// llvm-link tool.
/// Link all device library files and input file into one LLVM IR file.
static Expected<StringRef>
linkDeviceLibFiles(SmallVectorImpl<StringRef> &InputFiles,
const ArgList &Args) {
llvm::TimeTraceScope TimeScope("LinkDeviceLibraryFiles");

const char *LinkerExecutable = "llvm-link";

Expected<std::string> Linker =
findProgram(LinkerExecutable, {getExecutableDir(LinkerExecutable)});
if (!Linker)
return Linker.takeError();
llvm::LLVMContext Context;
llvm::SMDiagnostic Err;
auto DestModule =
std::make_unique<llvm::Module>("DeviceLibLinkedModule", Context);
auto MainModule = llvm::parseIRFile(InputFiles[0], Err, Context);
llvm::Linker::linkModules(*DestModule, std::move(MainModule), 0);
unsigned Flags = llvm::Linker::Flags::LinkOnlyNeeded;
for (size_t Idx = 1; Idx < InputFiles.size(); ++Idx) {
auto ModuleToLink = llvm::parseIRFile(InputFiles[Idx], Err, Context);
if (ModuleToLink) {
bool LinkFail = llvm::Linker::linkModules(*DestModule,
std::move(ModuleToLink), Flags);
if (LinkFail) {
return createStringError(inconvertibleErrorCode(),
"Link Device Library Failed!");
}
}
}

// Create a new file to write the linked device file to.
auto OutFileOrErr =
createOutputFile(sys::path::filename(ExecutableName), "bc");
if (!OutFileOrErr)
return OutFileOrErr.takeError();

// Build the command line.
SmallVector<StringRef, 8> CmdArgs;
CmdArgs.push_back(*Linker);
// Fill linker command line arguments.
CmdArgs.push_back("-only-needed");
CmdArgs.push_back("--suppress-warnings");
// Add input files.
for (auto &File : InputFiles)
CmdArgs.push_back(File);
// Specify output file.
CmdArgs.push_back("-o");
CmdArgs.push_back(*OutFileOrErr);
// Execute the linker command.
if (Error Err = executeCommands(*Linker, CmdArgs))
return std::move(Err);
std::error_code EC;
llvm::raw_fd_ostream OutModule(*OutFileOrErr, EC);
if (EC)
return createStringError(inconvertibleErrorCode(),
"Fail to create Linked Module File!");
llvm::WriteBitcodeToFile(*DestModule, OutModule);
return *OutFileOrErr;
}

Expand Down
Loading