[llvm-bugs] [Bug 28628] New: Include calling convention in function print

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Jul 20 08:37:52 PDT 2016


https://llvm.org/bugs/show_bug.cgi?id=28628

            Bug ID: 28628
           Summary: Include calling convention in function print
           Product: clang
           Version: trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: -New Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: keyboardsmoke at gmail.com
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified

Unsure if the option in PrettyPrinter.h is necessary, but I wanted it in my own
space. If there was already a way to specify my intention to print the calling
convention, please inform me and close this - but I didn't see one.

Index: PrettyPrinter.h
===================================================================
--- PrettyPrinter.h    (revision 275612)
+++ PrettyPrinter.h    (working copy)
@@ -50,7 +50,7 @@
       UseVoidForZeroParams(!LO.CPlusPlus),
       TerseOutput(false), PolishForDeclaration(false),
       Half(LO.Half), MSWChar(LO.MicrosoftExt && !LO.WChar),
-      IncludeNewlines(true), MSVCFormatting(false) { }
+      IncludeNewlines(true), IncludeCallingConvention(false),
MSVCFormatting(false) { }

   /// \brief Adjust this printing policy for cases where it's known that
   /// we're printing C++ code (for instance, if AST dumping reaches a
@@ -196,6 +196,9 @@
   /// \brief When true, include newlines after statements like "break", etc.
   unsigned IncludeNewlines : 1;

+  /// \brief When true, include calling convention information for functions.
+  unsigned IncludeCallingConvention : 1;
+
   /// \brief Use whitespace and punctuation like MSVC does. In particular,
this
   /// prints anonymous namespaces as `anonymous namespace' and does not insert
   /// spaces after template arguments.


Index: DeclPrinter.cpp
===================================================================
--- DeclPrinter.cpp    (revision 275612)
+++ DeclPrinter.cpp    (working copy)
@@ -620,6 +640,68 @@
         Out << "auto " << Proto << " -> ";
         Proto.clear();
       }
+
+      //
+      if (Policy.IncludeCallingConvention)
+      {
+          CallingConv cconv = AFT->getCallConv();
+
+          std::string ccname = AFT->getNameForCallConv(cconv).str();
+
+          if (Policy.MSVCFormatting)
+          {
+              switch (cconv)
+              {
+              case CC_C:
+              case CC_X86StdCall:
+              case CC_X86FastCall:
+              case CC_X86Pascal: // Not supported anymore.
+                  ccname = "__" + ccname;
+                  break;
+              case CC_X86ThisCall:
+                  if (!D->isCXXClassMember())
+                      ccname = "__" + ccname;
+                  else
+                      ccname = ""; // __thiscall is the default (at least for
MSVC...)
+
+                  break;
+              case CC_X86VectorCall:
+                  ccname = "_" + ccname;
+                  break;
+              default:
+                  // CC_X86Pascal
+                  // CC_X86_64Win64
+                  // CC_X86_64SysV
+                  // CC_AAPCS
+                  // CC_AAPCS_VFP
+                  // CC_IntelOclBicc
+                  // CC_SpirFunction
+                  // CC_OpenCLKernel
+                  // CC_Swift
+                  // CC_PreserveMost
+                  // CC_PreserveAll
+                  ccname = ""; // Not supported.
+                  break;
+              }
+          }
+          else
+          {
+              if (cconv == CC_AAPCS)
+                  ccname = "__attribute__((pcs(\"aapcs\")))";
+              else if (cconv == CC_AAPCS_VFP)
+                  ccname = "__attribute__((pcs(\"aapcs-vfp\")))";
+              else if (cconv == CC_SpirFunction)
+                  ccname = ""; // default for OpenCL functions on SPIR target
+              else if (cconv == CC_OpenCLKernel)
+                  ccname = ""; // inferred for OpenCL kernels
+              else
+                 ccname = "__attribute__((" + ccname + "))";
+          }
+
+          if (!ccname.empty())
+              Proto = ccname + " " + Proto;
+      }
+
       AFT->getReturnType().print(Out, Policy, Proto);
       Proto.clear();
     }

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160720/d505ce31/attachment.html>


More information about the llvm-bugs mailing list