[lld/COFF] Add /dwodir to enable DWARF fission with LTO

This patch added /dwodir to lld/COFF which is equivalent to lld/ELF
option -plugin-opt=dwo_dir=. This option tells LTO backend to create
dwo directory and files and all dwo files will be in it. Otherwise all
dwarf sections will be embeded into image even if -gsplit-dwarf is
specified when using LTO.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D154070
This commit is contained in:
Haohai Wen 2023-07-01 08:58:56 +08:00
parent b43375bb81
commit 2a631a8fed
5 changed files with 27 additions and 0 deletions

View File

@ -203,6 +203,9 @@ struct Configuration {
StringRef manifestUIAccess = "'false'";
StringRef manifestFile;
// used for /dwodir
StringRef dwoDir;
// Used for /aligncomm.
std::map<std::string, int> alignComm;

View File

@ -1910,6 +1910,9 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
fatal("/manifestinput: requires /manifest:embed");
}
// Handle /dwodir
config->dwoDir = args.getLastArgValue(OPT_dwodir);
config->thinLTOEmitImportsFiles = args.hasArg(OPT_thinlto_emit_imports_files);
config->thinLTOIndexOnly = args.hasArg(OPT_thinlto_index_only) ||
args.hasArg(OPT_thinlto_index_only_arg);

View File

@ -84,6 +84,7 @@ lto::Config BitcodeCompiler::createConfig() {
c.DisableVerify = true;
#endif
c.DiagHandler = diagnosticHandler;
c.DwoDir = ctx.config.dwoDir.str();
c.OptLevel = ctx.config.ltoo;
c.CPU = getCPUStr();
c.MAttrs = getMAttrs();

View File

@ -42,6 +42,8 @@ def color_diagnostics_eq: Joined<["--"], "color-diagnostics=">,
def defaultlib : P<"defaultlib", "Add the library to the list of input files">;
def delayload : P<"delayload", "Delay loaded DLL name">;
def diasdkdir : P<"diasdkdir", "Set the location of the DIA SDK">;
def dwodir : P<"dwodir",
"Directory to store .dwo files when LTO and debug fission are used">;
def entry : P<"entry", "Name of entry point symbol">;
def errorlimit : P<"errorlimit",
"Maximum number of errors to emit before stopping (0 = no limit)">;

View File

@ -0,0 +1,18 @@
; REQUIRES: x86
; RUN: opt %s -o %t1.o
; RUN: rm -rf %t.dir
; Test to ensure that -dwodir:$DIR creates .dwo files under $DIR
; RUN: lld-link -dwodir:%t.dir -noentry -dll %t1.o -out:%t.dll
; RUN: llvm-readobj -h %t.dir/0.dwo | FileCheck %s
; CHECK: Format: COFF-x86-64
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-windows-msvc"
define void @f() {
entry:
ret void
}