diff options
| -rw-r--r-- | lld/COFF/Config.h | 1 | ||||
| -rw-r--r-- | lld/COFF/Driver.cpp | 7 | ||||
| -rw-r--r-- | lld/COFF/Writer.cpp | 5 | ||||
| -rw-r--r-- | lld/test/COFF/long-section-name.test | 14 |
4 files changed, 25 insertions, 2 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index 309e1fbf99e..07fa48b3ebc 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -218,6 +218,7 @@ struct Configuration { bool warnMissingOrderSymbol = true; bool warnLocallyDefinedImported = true; bool warnDebugInfoUnusable = true; + bool warnLongSectionNames = true; bool incremental = true; bool integrityCheck = false; bool killAt = false; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 9f43d8c36d3..29c3fe7922f 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1188,6 +1188,8 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) { config->warnDebugInfoUnusable = false; else if (s == "4217") config->warnLocallyDefinedImported = false; + else if (s == "longsections") + config->warnLongSectionNames = false; // Other warning numbers are ignored. } } @@ -1527,6 +1529,11 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) { config->debugGHashes = debug == DebugKind::GHash; config->debugSymtab = debug == DebugKind::Symtab; + // Don't warn about long section names, such as .debug_info, for mingw or when + // -debug:dwarf is requested. + if (config->mingw || config->debugDwarf) + config->warnLongSectionNames = false; + config->mapFile = getMapFile(args); if (config->incremental && args.hasArg(OPT_profile)) { diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 9729c6938ec..9638f4202e0 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1148,6 +1148,11 @@ void Writer::createSymbolAndStringTable() { continue; if ((sec->header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0) continue; + if (config->warnLongSectionNames) { + warn("section name " + sec->name + + " is longer than 8 characters and will use a non-standard string " + "table"); + } sec->setStringTableOff(addEntryToStringTable(sec->name)); } diff --git a/lld/test/COFF/long-section-name.test b/lld/test/COFF/long-section-name.test index 6cb88e17bfe..458c44122dd 100644 --- a/lld/test/COFF/long-section-name.test +++ b/lld/test/COFF/long-section-name.test @@ -1,8 +1,18 @@ # RUN: yaml2obj < %s > %t.obj -# RUN: lld-link /out:%t.exe /entry:main %t.obj +# RUN: lld-link /out:%t.exe /entry:main %t.obj 2>&1 | FileCheck %s --check-prefix=WARN # RUN: llvm-readobj --sections %t.exe | FileCheck %s -# RUN: lld-link /debug /out:%t2.exe /entry:main %t.obj +# RUN: lld-link /debug /out:%t2.exe /entry:main %t.obj 2>&1 | FileCheck %s --check-prefix=WARN # RUN: llvm-readobj --sections %t2.exe | FileCheck %s +# +# No warnings in mingw mode or with ignore flag. +# RUN: lld-link /out:%t.exe /entry:main %t.obj /ignore:longsections 2>&1 | FileCheck %s --check-prefix=IGNORE --allow-empty +# RUN: lld-link /out:%t.exe /entry:main %t.obj -lldmingw 2>&1 | FileCheck %s --check-prefix=IGNORE --allow-empty +# RUN: lld-link /out:%t.exe /entry:main %t.obj -debug:dwarf 2>&1 | FileCheck %s --check-prefix=IGNORE --allow-empty + +# WARN: warning: section name .data_long_section_name is longer than 8 characters and will use a non-standard string table +# WARN: warning: section name .text_long_section_name is longer than 8 characters and will use a non-standard string table + +# IGNORE-NOT: warning: # CHECK: Name: .eh_fram ( # CHECK: Name: .data_long_section_name |

