[PATCH] D34475: [AArch64] Add support for __builtin_ms_va_list on aarch64

Reid Kleckner via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 13 13:10:39 PDT 2017


rnk added inline comments.


================
Comment at: include/clang/Basic/BuiltinsAArch64.def:65
+// Win64-compatible va_list functions
+BUILTIN(__builtin_ms_va_start, "vc*&.", "nt")
+BUILTIN(__builtin_ms_va_end, "vc*&", "n")
----------------
I strongly suspect that Microsoft will never adopt a varargs calling convention that uses a complex, non-`char*` va_list.

I'm starting to think we should move this to the generic builtin list and make it available everywhere. The semantics are that you can only use __builtin_ms_va_start in ms_abi functions. It always produces a `char*`-style va_list.



================
Comment at: include/clang/Basic/Specifiers.h:239
     CC_X86Pascal,   // __attribute__((pascal))
     CC_X86_64Win64, // __attribute__((ms_abi))
     CC_X86_64SysV,  // __attribute__((sysv_abi))
----------------
I think we might prefer to make this non-x86_64 specific. I suspect that this pattern will arise again on ARM32 if anyone goes back there in seriousness. We'll probably want sysv_abi as well as ms_abi, and all the logic should be independent of the ISA: ms_abi is a no-op when the target OS is already Windows, and sysv_abi is a no-op when the target OS isn't Windows.


================
Comment at: lib/CodeGen/CGBuiltin.cpp:5276
                                                const CallExpr *E) {
+  if (BuiltinID == AArch64::BI__builtin_ms_va_start ||
+      BuiltinID == AArch64::BI__builtin_ms_va_end)
----------------
If we made __builtin_ms_va_start generic, that would also eliminate this duplicate code.


================
Comment at: lib/CodeGen/CGCall.cpp:223-224
   if (D->hasAttr<MSABIAttr>())
-    return IsWindows ? CC_C : CC_X86_64Win64;
+    return IsWindows ? CC_C : Arch == llvm::Triple::aarch64 ? CC_AArch64Win64
+                                                            : CC_X86_64Win64;
 
----------------
Unifying the ms_abi CCs would remove the need for this.


================
Comment at: lib/Sema/SemaChecking.cpp:3625
 /// target and calling convention.
 static bool checkVAStartABI(Sema &S, unsigned BuiltinID, Expr *Fn) {
   const llvm::Triple &TT = S.Context.getTargetInfo().getTriple();
----------------
Oh dear, how can we keep this simple. I think unifying the CC's would improve things.


================
Comment at: lib/Sema/SemaDeclAttr.cpp:4283
+
+    CC = Context.getTargetInfo().getTriple().isOSWindows()
+             ? CC_C
----------------
Ditto


https://reviews.llvm.org/D34475





More information about the cfe-commits mailing list