Hi,

This patch adds a flag to the frontend (-cc1) to turn on the very
experimental Microsoft Visual C++ ABI support. I wanted to run it past
you guys (Daniel in particular, since he maintains the driver and
frontend) before committing.

Chip
Index: include/clang/CodeGen/CodeGenOptions.h
===================================================================
--- include/clang/CodeGen/CodeGenOptions.h      (revision 105767)
+++ include/clang/CodeGen/CodeGenOptions.h      (working copy)
@@ -78,6 +78,9 @@
   /// The ABI to use for passing floating point arguments.
   std::string FloatABI;
 
+  /// The C++ ABI for which to generate code.
+  std::string CXXABI;
+
   /// The float precision limit to use, if non-empty.
   std::string LimitFloatPrecision;
 
@@ -120,6 +123,7 @@
     VerifyModule = 1;
 
     Inlining = NoInlining;
+    CXXABI = "itanium";
     RelocationModel = "pic";
   }
 
Index: include/clang/Driver/CC1Options.td
===================================================================
--- include/clang/Driver/CC1Options.td  (revision 105767)
+++ include/clang/Driver/CC1Options.td  (working copy)
@@ -383,6 +383,8 @@
   HelpText<"Language standard to compile for">;
 def fmath_errno : Flag<"-fmath-errno">,
   HelpText<"Require math functions to indicate errors by setting errno">;
+def fms_cxx_abi : Flag<"-fms-c++-abi">,
+  HelpText<"Generate code for the Microsoft Visual C++ ABI">;
 def fms_extensions : Flag<"-fms-extensions">,
   HelpText<"Accept some non-standard constructs used in Microsoft header files 
">;
 def main_file_name : Separate<"-main-file-name">,
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp (revision 105767)
+++ lib/Frontend/CompilerInvocation.cpp (working copy)
@@ -803,6 +803,8 @@
   Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
   Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
   Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
+  if (Args.hasArg(OPT_fms_cxx_abi))
+    Opts.CXXABI = "microsoft";
   Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
   Opts.NoCommon = Args.hasArg(OPT_fno_common);
   Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
Index: lib/CodeGen/MicrosoftCXXABI.cpp
===================================================================
--- lib/CodeGen/MicrosoftCXXABI.cpp     (revision 105767)
+++ lib/CodeGen/MicrosoftCXXABI.cpp     (working copy)
@@ -124,7 +124,7 @@
   assert(false && "Can't yet mangle destructors!");
 }
 
-CXXABI *CreateMicrosoftCXXABI(CodeGenModule &CGM) {
+CXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
   return new MicrosoftCXXABI(CGM);
 }
 
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp       (revision 105767)
+++ lib/CodeGen/CodeGenModule.cpp       (working copy)
@@ -86,8 +86,10 @@
 }
 
 void CodeGenModule::createCXXABI() {
-  // For now, just create an Itanium ABI.
-  ABI = CreateItaniumCXXABI(*this);
+  if (CodeGenOpts.CXXABI == "microsoft")
+    ABI = CreateMicrosoftCXXABI(*this);
+  else
+    ABI = CreateItaniumCXXABI(*this);
 }
 
 void CodeGenModule::Release() {
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to