From 1eaf8a5165d55cab4b844ae82c3a952c81023473 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Wed, 7 May 2025 00:55:04 -0700 Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?= =?UTF-8?q?itial=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.5-bogner --- llvm/lib/MC/MCContext.cpp | 21 +++++++++++++++++++++ llvm/test/MC/ELF/symbol-names.s | 19 ++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index f70087e14f702..41caf20b331b2 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -212,6 +212,27 @@ MCDataFragment *MCContext::allocInitialFragment(MCSection &Sec) { MCSymbol *MCContext::getOrCreateSymbol(const Twine &Name) { SmallString<128> NameSV; StringRef NameRef = Name.toStringRef(NameSV); + if (NameRef.contains('\\')) { + NameSV = NameRef; + size_t S = 0; + // Support escaped \\ and \" as in GNU Assembler. GAS issues a warning for + // other characters following \\, which we do not implement due to code + // structure. + for (size_t I = 0, E = NameSV.size(); I < E; ++I) { + char C = NameSV[I]; + if (C == '\\') { + switch (NameSV[I + 1]) { + case '"': + case '\\': + C = NameSV[++I]; + break; + } + } + NameSV[S++] = C; + } + NameSV.resize(S); + NameRef = NameSV; + } assert(!NameRef.empty() && "Normal symbols cannot be unnamed!"); diff --git a/llvm/test/MC/ELF/symbol-names.s b/llvm/test/MC/ELF/symbol-names.s index f605c723d4d4d..8c891052ebd9a 100644 --- a/llvm/test/MC/ELF/symbol-names.s +++ b/llvm/test/MC/ELF/symbol-names.s @@ -1,12 +1,25 @@ -// RUN: llvm-mc -triple i686-pc-linux -filetype=obj %s -o - | llvm-readobj --symbols - | FileCheck %s +// RUN: llvm-mc -triple=x86_64 -filetype=obj %s | llvm-objdump -tdr - | FileCheck %s // MC allows ?'s in symbol names as an extension. +// CHECK-LABEL:SYMBOL TABLE: +// CHECK-NEXT: 0000000000000001 l F .text 0000000000000000 a"b\{{$}} +// CHECK-NEXT: 0000000000000000 g F .text 0000000000000000 foo?bar +// CHECK-NEXT: 0000000000000000 *UND* 0000000000000000 a"b\q{{$}} +// CHECK-EMPTY: + .text .globl foo?bar .type foo?bar, @function foo?bar: ret -// CHECK: Symbol -// CHECK: Name: foo?bar +// CHECK-LABEL:: +// CHECK-NEXT: callq {{.*}} +// CHECK-NEXT: callq {{.*}} +// CHECK-NEXT: R_X86_64_PLT32 a"b\q-0x4 +.type "a\"b\\", @function +"a\"b\\": + call "a\"b\\" +/// GAS emits a warning for \q + call "a\"b\q" From 688b66793add274fac2aa6877c2d01ccaaa5222a Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Wed, 7 May 2025 23:00:29 -0700 Subject: [PATCH 2/2] update safeseh.s Created using spr 1.3.5-bogner --- llvm/lib/MC/MCSymbol.cpp | 2 ++ llvm/test/MC/COFF/safeseh.s | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/MC/MCSymbol.cpp b/llvm/lib/MC/MCSymbol.cpp index 2a709f4aef80c..3ca85b76a35d9 100644 --- a/llvm/lib/MC/MCSymbol.cpp +++ b/llvm/lib/MC/MCSymbol.cpp @@ -74,6 +74,8 @@ void MCSymbol::print(raw_ostream &OS, const MCAsmInfo *MAI) const { OS << "\\n"; else if (C == '"') OS << "\\\""; + else if (C == '\\') + OS << "\\\\"; else OS << C; } diff --git a/llvm/test/MC/COFF/safeseh.s b/llvm/test/MC/COFF/safeseh.s index d21628daff5fa..afcdc771ff994 100644 --- a/llvm/test/MC/COFF/safeseh.s +++ b/llvm/test/MC/COFF/safeseh.s @@ -2,5 +2,5 @@ // check that we quote the output of .safeseh -.safeseh "\01foo" -// CHECK: .safeseh "\01foo" +.safeseh "\\foo" +// CHECK: .safeseh "\\foo"