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..4e554564ca9 --- /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 0 +pragma(mangle, "\1myGlobal") +__gshared int myGlobal; + +// CHECK: define void @"\01myFunction"() +pragma(mangle, "\1myFunction") +void myFunction() {}