summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoger Kim <rgr@fb.com>2022-02-11 19:33:23 -0500
committerJez Ng <jezng@fb.com>2022-02-11 19:42:20 -0500
commit4f2c46c35ccd17ef726c4b4e8e9500d7972e757a (patch)
treea1da30c7657f5826010e90aff0bb84ed8e97a069
parent6759cdd82918e186ded1eda1a86b47e13469a811 (diff)
Print C-string literals in mapfile
This diff has the C-string literals printed into the mapfile in the symbol table like how ld64 does. Here is what ld64's mapfile looks like with C-string literals: ``` # Path: out # Arch: x86_64 # Object files: [ 0] linker synthesized [ 1] foo.o # Sections: # Address Size Segment Section 0x100003F7D 0x0000001D __TEXT __text 0x100003F9A 0x0000001E __TEXT __cstring 0x100003FB8 0x00000048 __TEXT __unwind_info # Symbols: # Address Size File Name 0x100003F7D 0x0000001D [ 1] _main 0x100003F9A 0x0000000E [ 1] literal string: Hello world!\n 0x100003FA8 0x00000010 [ 1] literal string: Hello, it's me\n 0x100003FB8 0x00000048 [ 0] compact unwind info ``` Here is what the new lld's Mach-O mapfile looks like: ``` # Path: /Users/rgr/local/llvm-project/build/Debug/tools/lld/test/MachO/Output/map-file.s.tmp/c-string-liter al-out # Arch: x86_64 # Object files: [ 0] linker synthesized [ 1] /Users/rgr/local/llvm-project/build/Debug/tools/lld/test/MachO/Output/map-file.s.tmp/c-string-literal .o # Sections: # Address Size Segment Section 0x1000002E0 0x0000001D __TEXT __text 0x1000002FD 0x0000001D __TEXT __cstring # Symbols: # Address File Name 0x1000002E0 [ 1] _main 0x1000002FD [ 1] literal string: Hello world!\n 0x10000030B [ 1] literal string: Hello, it's me\n ``` Reviewed By: #lld-macho, int3 Differential Revision: https://reviews.llvm.org/D118077
-rw-r--r--lld/MachO/MapFile.cpp23
-rw-r--r--lld/test/MachO/map-file.s39
2 files changed, 61 insertions, 1 deletions
diff --git a/lld/MachO/MapFile.cpp b/lld/MachO/MapFile.cpp
index 8f9381ff0d79..a4a0065c2816 100644
--- a/lld/MachO/MapFile.cpp
+++ b/lld/MachO/MapFile.cpp
@@ -31,6 +31,7 @@
#include "OutputSection.h"
#include "OutputSegment.h"
#include "Symbols.h"
+#include "SyntheticSections.h"
#include "Target.h"
#include "llvm/Support/Parallel.h"
#include "llvm/Support/TimeProfiler.h"
@@ -76,7 +77,27 @@ getSymbolStrings(ArrayRef<Defined *> syms) {
std::vector<std::string> str(syms.size());
parallelForEachN(0, syms.size(), [&](size_t i) {
raw_string_ostream os(str[i]);
- os << toString(*syms[i]);
+ Defined *sym = syms[i];
+
+ switch (sym->isec->kind()) {
+ case InputSection::CStringLiteralKind: {
+ // Output "literal string: <string literal>"
+ const auto *isec = cast<CStringInputSection>(sym->isec);
+ const StringPiece &piece = isec->getStringPiece(sym->value);
+ assert(
+ sym->value == piece.inSecOff &&
+ "We expect symbols to always point to the start of a StringPiece.");
+ StringRef str = isec->getStringRef(&piece - &(*isec->pieces.begin()));
+ assert(str.back() == '\000');
+ (os << "literal string: ")
+ // Remove null sequence at the end
+ .write_escaped(str.substr(0, str.size() - 1));
+ break;
+ }
+ case InputSection::ConcatKind:
+ case InputSection::WordLiteralKind:
+ os << toString(*sym);
+ }
});
DenseMap<Symbol *, std::string> ret;
diff --git a/lld/test/MachO/map-file.s b/lld/test/MachO/map-file.s
index 85c23e763e9e..aa0bc6a8caf1 100644
--- a/lld/test/MachO/map-file.s
+++ b/lld/test/MachO/map-file.s
@@ -2,6 +2,7 @@
# RUN: rm -rf %t; split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/c-string-literal.s -o %t/c-string-literal.o
# RUN: %lld -map %t/map %t/test.o %t/foo.o --time-trace -o %t/test-map
# RUN: llvm-objdump --syms --section-headers %t/test-map > %t/objdump
@@ -51,4 +52,42 @@ _main:
# CHECK-NEXT: 0x[[#FOO]] [ 2] _foo
# CHECK-NEXT: 0x[[#NUMBER]] [ 1] _number
+#--- c-string-literal.s
+.section __TEXT,__cstring
+.globl _hello_world, _hello_its_me, _main
+
+_hello_world:
+.asciz "Hello world!\n"
+
+_hello_its_me:
+.asciz "Hello, it's me"
+
+.text
+_main:
+ movl $0x2000004, %eax # write() syscall
+ mov $1, %rdi # stdout
+ leaq _hello_world(%rip), %rsi
+ mov $13, %rdx # length of str
+ syscall
+ ret
+
+# RUN: %lld -map %t/c-string-literal-map %t/c-string-literal.o -o %t/c-string-literal-out
+# RUN: FileCheck --check-prefix=CSTRING %s < %t/c-string-literal-map
+
+## C-string literals should be printed as "literal string: <C string literal>"
+# CSTRING-LABEL: Symbols:
+# CSTRING-DAG: _main
+# CSTRING-DAG: literal string: Hello world!\n
+# CSTRING-DAG: literal string: Hello, it's me
+
+# RUN: %lld -dead_strip -map %t/dead-c-string-literal-map %t/c-string-literal.o -o %t/dead-c-string-literal-out
+# RUN: FileCheck --check-prefix=DEADCSTRING %s < %t/dead-c-string-literal-map
+
+## C-string literals should be printed as "literal string: <C string literal>"
+# DEADCSTRING-LABEL: Symbols:
+# DEADCSTRING-DAG: _main
+# DEADCSTRING-DAG: literal string: Hello world!\n
+# DEADCSTRING-LABEL: Dead Stripped Symbols:
+# DEADCSTRING-DAG: literal string: Hello, it's me
+
# MAPFILE: "name":"Total Write map file"