[pkg-d-commits] [ldc] 90/149: Fix naked functions mangling regression for Win32

Matthias Klumpp mak at moszumanska.debian.org
Sun Apr 23 22:37:01 UTC 2017


This is an automated email from the git hooks/post-receive script.

mak pushed a commit to annotated tag v1.2.0
in repository ldc.

commit d14fdf6cac9bb878f809e95f50fd1918904edd86
Author: Martin <noone at nowhere.com>
Date:   Tue Feb 7 00:35:42 2017 +0100

    Fix naked functions mangling regression for Win32
---
 gen/naked.cpp | 44 +++++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/gen/naked.cpp b/gen/naked.cpp
index 67823f3..1d6ccfc 100644
--- a/gen/naked.cpp
+++ b/gen/naked.cpp
@@ -17,7 +17,6 @@
 #include "gen/llvm.h"
 #include "gen/llvmhelpers.h"
 #include "gen/logger.h"
-#include "gen/mangling.h"
 #include "gen/tollvm.h"
 #include "ir/irfunction.h"
 #include "llvm/IR/InlineAsm.h"
@@ -151,26 +150,23 @@ void DtoDefineNakedFunction(FuncDeclaration *fd) {
 
   // FIXME: could we perhaps use llvm asmwriter to give us these details ?
 
-  std::string mangle = getMangledName(fd, fd->linkage);
-  // strip special leading 1-byte (prevents LLVM from additional mangling)
-  if (mangle[0] == '\1')
-    mangle.erase(0, 1);
-  // leading ? apparently needs quoting, at least for x86(_64)
-  if (mangle[0] == '?') {
-    mangle.insert(0, "\"");
-    mangle += '"';
-  }
+  const char *mangle = mangleExact(fd);
+  std::string fullmangle; // buffer only
 
   std::ostringstream tmpstr;
 
-  bool const isWin = global.params.targetTriple->isOSWindows();
-  bool const isOSX =
-      (global.params.targetTriple->getOS() == llvm::Triple::Darwin ||
-       global.params.targetTriple->getOS() == llvm::Triple::MacOSX);
+  const auto &triple = *global.params.targetTriple;
+  bool const isWin = triple.isOSWindows();
+  bool const isOSX = (triple.getOS() == llvm::Triple::Darwin ||
+                      triple.getOS() == llvm::Triple::MacOSX);
 
   // osx is different
   // also mangling has an extra underscore prefixed
   if (isOSX) {
+    fullmangle += '_';
+    fullmangle += mangle;
+    mangle = fullmangle.c_str();
+
     std::string section = "text";
     bool weak = false;
     if (DtoIsTemplateInstance(fd)) {
@@ -180,14 +176,28 @@ void DtoDefineNakedFunction(FuncDeclaration *fd) {
     }
     asmstr << "\t." << section << std::endl;
     asmstr << "\t.align\t4, 0x90" << std::endl;
-    asmstr << "\t.globl\t_" << mangle << std::endl;
+    asmstr << "\t.globl\t" << mangle << std::endl;
     if (weak) {
-      asmstr << "\t.weak_definition\t_" << mangle << std::endl;
+      asmstr << "\t.weak_definition\t" << mangle << std::endl;
     }
-    asmstr << "_" << mangle << ":" << std::endl;
+    asmstr << mangle << ":" << std::endl;
   }
   // Windows is different
   else if (isWin) {
+    // prepend extra underscore for Win32
+    if (triple.isArch32Bit()) {
+      fullmangle += '_';
+      fullmangle += mangle;
+      mangle = fullmangle.c_str();
+    }
+    // leading ? apparently needs quoting, at least for Win64
+    else if (mangle[0] == '?') {
+      fullmangle += '"';
+      fullmangle += mangle;
+      fullmangle += '"';
+      mangle = fullmangle.c_str();
+    }
+
     asmstr << "\t.def\t" << mangle << ";" << std::endl;
     // hard code these two numbers for now since gas ignores .scl and llvm
     // is defaulting to .type 32 for everything I have seen

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-d/ldc.git



More information about the pkg-d-commits mailing list