[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