[LLD][COFF] Generate map file even if no /out flag is present

Currently LLD does not generate a map file if no /out flag (e.g., /out:a.exe) is
present. This is because LLD derives the map file's name from the default output
file name is no output file name is specified explicitly on the command
line. However, in this case, the default output file name has not been set by
LLD yet when LLD tries to set the name of the map file. This patch fixes this
corner case by moving the logic handling map file flags to a place after the
default output file name is set.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D134559
This commit is contained in:
Pengxuan Zheng 2022-09-23 12:39:34 -07:00
parent 53c3664f67
commit 961c45fd9f
2 changed files with 24 additions and 19 deletions

View File

@ -1919,25 +1919,6 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
if (config->mingw || config->debugDwarf)
config->warnLongSectionNames = false;
config->lldmapFile = getMapFile(args, OPT_lldmap, OPT_lldmap_file);
config->mapFile = getMapFile(args, OPT_map, OPT_map_file);
if (config->mapFile != "" && args.hasArg(OPT_map_info)) {
for (auto *arg : args.filtered(OPT_map_info)) {
std::string s = StringRef(arg->getValue()).lower();
if (s == "exports")
config->mapInfo = true;
else
error("unknown option: /mapinfo:" + s);
}
}
if (config->lldmapFile != "" && config->lldmapFile == config->mapFile) {
warn("/lldmap and /map have the same output file '" + config->mapFile +
"'.\n>>> ignoring /lldmap");
config->lldmapFile.clear();
}
if (config->incremental && args.hasArg(OPT_profile)) {
warn("ignoring '/incremental' due to '/profile' specification");
config->incremental = false;
@ -2143,6 +2124,25 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
return;
}
config->lldmapFile = getMapFile(args, OPT_lldmap, OPT_lldmap_file);
config->mapFile = getMapFile(args, OPT_map, OPT_map_file);
if (config->mapFile != "" && args.hasArg(OPT_map_info)) {
for (auto *arg : args.filtered(OPT_map_info)) {
std::string s = StringRef(arg->getValue()).lower();
if (s == "exports")
config->mapInfo = true;
else
error("unknown option: /mapinfo:" + s);
}
}
if (config->lldmapFile != "" && config->lldmapFile == config->mapFile) {
warn("/lldmap and /map have the same output file '" + config->mapFile +
"'.\n>>> ignoring /lldmap");
config->lldmapFile.clear();
}
if (shouldCreatePDB) {
// Put the PDB next to the image if no /pdb flag was passed.
if (config->pdbPath.empty()) {

View File

@ -11,6 +11,11 @@
# RUN: lld-link /out:%t.dll /dll %t-dll.obj /export:exportfn1 \
# RUN: /export:foo=exportfn2 /map /mapinfo:exports
# RUN: FileCheck -check-prefix=MAPINFO -strict-whitespace %s < %t.map
# RUN: rm -rf %t && mkdir -p %t && cd %t
# RUN: cp %t.obj map.test.tmp.obj
# RUN: cp %t-dll.lib map.test.tmp-dll.lib
# RUN: lld-link /entry:main map.test.tmp.obj map.test.tmp-dll.lib /map
# RUN: FileCheck -check-prefix=MAP -strict-whitespace %s < map.test.tmp.map
# MAP: {{.*}}
# MAP-EMPTY: