From e0a11b3db586714e53426411fadf995ba2e9af84 Mon Sep 17 00:00:00 2001 From: Martin Kinkelin Date: Fri, 15 Oct 2021 17:25:54 +0200 Subject: [PATCH 1/3] Support 'raw mangles' via leading "\1" in pragma(mangle) strings Such mangled names aren't affected by a target-specific default (C) prefix, such as `_` on Mac. --- dmd/dsymbolsem.d | 9 +++++++++ gen/mangling.cpp | 8 ++++++-- tests/codegen/mangling_raw.d | 11 +++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/codegen/mangling_raw.d diff --git a/dmd/dsymbolsem.d b/dmd/dsymbolsem.d index dfd54f664f0..a7b62cf5a15 100644 --- a/dmd/dsymbolsem.d +++ b/dmd/dsymbolsem.d @@ -1526,6 +1526,15 @@ version (IN_LLVM) dchar c = slice[i]; if (c < 0x80) { + version (IN_LLVM) + { + // LDC: allow leading "\1" to prevent target-specific prefix + if (i == 0 && c == '\1') + { + ++i; + continue; + } + } if (c.isValidMangling) { ++i; diff --git a/gen/mangling.cpp b/gen/mangling.cpp index ce32e829eb7..e7a8daa29d4 100644 --- a/gen/mangling.cpp +++ b/gen/mangling.cpp @@ -125,11 +125,15 @@ std::string getIRMangledName(VarDeclaration *vd) { } std::string getIRMangledFuncName(std::string baseMangle, LINK link) { - return gABI->mangleFunctionForLLVM(std::move(baseMangle), link); + return baseMangle[0] == '\1' + ? baseMangle + : gABI->mangleFunctionForLLVM(std::move(baseMangle), link); } std::string getIRMangledVarName(std::string baseMangle, LINK link) { - return gABI->mangleVariableForLLVM(std::move(baseMangle), link); + return baseMangle[0] == '\1' + ? baseMangle + : gABI->mangleVariableForLLVM(std::move(baseMangle), link); } std::string getIRMangledAggregateName(AggregateDeclaration *ad, diff --git a/tests/codegen/mangling_raw.d b/tests/codegen/mangling_raw.d new file mode 100644 index 00000000000..11567e5f23f --- /dev/null +++ b/tests/codegen/mangling_raw.d @@ -0,0 +1,11 @@ +// Tests that 'raw mangles' starting with "\1" are correctly propagated to IR. + +// RUN: %ldc -output-ll -of=%t.ll %s && FileCheck %s < %t.ll + +// CHECK: @"\01myGlobal" = global i32 +pragma(mangle, "\1myGlobal") +__gshared int myGlobal; + +// CHECK: define {{.*}} @"\01myFunction"() +pragma(mangle, "\1myFunction") +void myFunction() {} From fe38f1359eae94c1cf5c991080b23222ff3353d1 Mon Sep 17 00:00:00 2001 From: Martin Kinkelin Date: Thu, 21 Oct 2021 21:56:37 +0200 Subject: [PATCH 2/3] [std::move nano-optimization] --- gen/mangling.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gen/mangling.cpp b/gen/mangling.cpp index e7a8daa29d4..a0e86ec2409 100644 --- a/gen/mangling.cpp +++ b/gen/mangling.cpp @@ -126,13 +126,13 @@ std::string getIRMangledName(VarDeclaration *vd) { std::string getIRMangledFuncName(std::string baseMangle, LINK link) { return baseMangle[0] == '\1' - ? baseMangle + ? std::move(baseMangle) : gABI->mangleFunctionForLLVM(std::move(baseMangle), link); } std::string getIRMangledVarName(std::string baseMangle, LINK link) { return baseMangle[0] == '\1' - ? baseMangle + ? std::move(baseMangle) : gABI->mangleVariableForLLVM(std::move(baseMangle), link); } From 357ebd44461338695d71549ff95cc63d19d8921d Mon Sep 17 00:00:00 2001 From: Martin Kinkelin Date: Fri, 22 Oct 2021 20:17:37 +0200 Subject: [PATCH 3/3] [slightly improve test robustness] --- tests/codegen/mangling_raw.d | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codegen/mangling_raw.d b/tests/codegen/mangling_raw.d index 11567e5f23f..a2dc20c4531 100644 --- a/tests/codegen/mangling_raw.d +++ b/tests/codegen/mangling_raw.d @@ -2,10 +2,10 @@ // RUN: %ldc -output-ll -of=%t.ll %s && FileCheck %s < %t.ll -// CHECK: @"\01myGlobal" = global i32 -pragma(mangle, "\1myGlobal") +// CHECK: @"\01my$Global" = global i32 +pragma(mangle, "\1my$Global") __gshared int myGlobal; -// CHECK: define {{.*}} @"\01myFunction"() -pragma(mangle, "\1myFunction") +// CHECK: define {{.*}} @"\01my$Function"() +pragma(mangle, "\1my$Function") void myFunction() {}