[cfe-commits] support for Borland extensions and __pascal

Douglas Gregor dgregor at apple.com
Wed Sep 1 09:33:35 PDT 2010


On Aug 31, 2010, at 3:30 PM, dawn at burble.org wrote:

> 
> This patch adds support for Borland extensions under the option
> -fborland-extensions, as well as semantic support for the "__pascal" calling
> convention (not yet added to llvm).

Typically, we prefer separate patches for separate changes. In this case, -fborland-extensions in one patch and __pascal as a follow-on.

> At this time, it's not possible to disctinguish between GNU attributes
> and those of and other vendors, so the calling convention is supported
> the same as MS calling conventions like "__thiscall".
> "__attribute__((pascal))" is also supported with this patch for
> consistency - I could remove this support, but since clang seems
> to want to print "__attribute__((pascal))" for "__pascal", it made more
> sense to just allow it.  

I agree that it makes sense to allow it. It's really the _pascal that we want to enable with -fborland-extensions.

> Note from the test case that there's an issue with pointer to member
> functions which I have yet to diagnose.


I see that the same problem occurs with other calling conventions, because we're not properly handling calling-convention attributes for member function pointers. That's now fixed in r112715, thanks!

The patch is looking really good. There are a few small things I'd like addressed before committing it:

The patch is missing modifications to various TableGen files, e.g., Attr.td, Options.td, and CC1Options.td. Without those, it won't build.

Index: include/clang/Basic/TokenKinds.def
===================================================================
--- include/clang/Basic/TokenKinds.def	(revision 112654)
+++ include/clang/Basic/TokenKinds.def	(working copy)
@@ -335,6 +335,9 @@
 KEYWORD(__thiscall                  , KEYALL)
 KEYWORD(__forceinline               , KEYALL)
 
+// Borland Extension.
+KEYWORD(__pascal                    , KEYALL)
+
 // Altivec Extension.
 KEYWORD(__vector                    , KEYALTIVEC)
 KEYWORD(__pixel                     , KEYALTIVEC)
@@ -371,6 +374,9 @@
 ALIAS("_stdcall"     , __stdcall  , KEYMS)
 ALIAS("_thiscall"    , __thiscall , KEYMS)
 
+// Borland Extensions.
+ALIAS("_pascal"      , __pascal   , KEYMS)
+

Why re-use KEYMS rather than introducing a new KEYBORLAND that is tied to -fborland-extensions?

Index: lib/CodeGen/CGCall.cpp
===================================================================
--- lib/CodeGen/CGCall.cpp	(revision 112654)
+++ lib/CodeGen/CGCall.cpp	(working copy)
@@ -36,6 +36,7 @@
   case CC_X86StdCall: return llvm::CallingConv::X86_StdCall;
   case CC_X86FastCall: return llvm::CallingConv::X86_FastCall;
   case CC_X86ThisCall: return llvm::CallingConv::X86_ThisCall;
+  // TODO: add support for CC_X86Pascal to llvm
   }
 }

Typically, we'd want to emit an error here rather than silently using the wrong calling convention. But, in this case, getting a Diagnostic object all the way down to this routine is a pain. So, in this case, a diagnostic further up in CodeGen, e.g., when we see a DeclRefExpr that refers to a function with PascalAttr, would suffice.

Everything else looks great, thanks!

	- Doug



More information about the cfe-commits mailing list