Open Quuxplusone opened 8 years ago
Bugzilla Link | PR28628 |
Status | NEW |
Importance | P enhancement |
Reported by | Andrew Artz (keyboardsmoke@gmail.com) |
Reported on | 2016-07-20 10:37:52 -0700 |
Last modified on | 2016-07-20 11:35:36 -0700 |
Version | trunk |
Hardware | All All |
CC | llvm-bugs@lists.llvm.org, rnk@google.com |
Fixed by commit(s) | |
Attachments | |
Blocks | |
Blocked by | |
See also |
I thought we already handled it in TypePrinter, but maybe DeclPrinter doesn't use that for printing declarators.
Just noticed I left in CC_X86Pascal for MSVC. Awkward, it shouldn't be an issue unless some calling convention is found to be __pascal by clang. Unlikely but possible.
printFunctionProtoAfter does contain some functionality to add the calling convention, with no MSVC support (it seems?). I haven't been using the TypePrinter, but perhaps it might be better to move over and attempt to rectify some of these issues there as well.
Well after some chatting in #llvm I am lead to believe patches like these aren't exactly necessary because MSVC compat in printing isn't something that clang is reaching for right now.
The bug itself is not invalid, I believe - because outside of TypePrinter calling conventions aren't printed which may not be desirable, but perhaps some of the MSVC specific compatibility stuff can be stripped out.
Let's try something more like this, then...
I would have reused TypePrinter stuff, but it isn't exposed in a manner that
makes this simple.
This fixes the 'bug' without introducing too much headache, whether or not an
option is warranted isn't up to me, I suppose, but the TypePrinter does it
without an option so it should be fine.
Index: DeclPrinter.cpp
===================================================================
--- DeclPrinter.cpp (revision 275612)
+++ DeclPrinter.cpp (working copy)
@@ -620,6 +640,24 @@
Out << "auto " << Proto << " -> ";
Proto.clear();
}
+
+ CallingConv cconv = AFT->getCallConv();
+ std::string ccname = AFT->getNameForCallConv(cconv).str();
+
+ 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();
}