forked from OSchip/llvm-project
[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:
parent
53c3664f67
commit
961c45fd9f
|
@ -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()) {
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue