r227796 - MS ABI: Implement support for 'novtable'

Aaron Ballman aaron at aaronballman.com
Mon Feb 2 04:40:24 PST 2015


On Mon, Feb 2, 2015 at 5:22 AM, David Majnemer <david.majnemer at gmail.com> wrote:
> Author: majnemer
> Date: Mon Feb  2 04:22:20 2015
> New Revision: 227796
>
> URL: http://llvm.org/viewvc/llvm-project?rev=227796&view=rev
> Log:
> MS ABI: Implement support for 'novtable'
>
> It is common for COM interface classes to be marked as 'novtable' to
> tell the compiler that constructors and destructors should not reference
> virtual function tables.
>
> This commit implements this feature in clang.
>
> Modified:
>     cfe/trunk/include/clang/Basic/Attr.td
>     cfe/trunk/lib/CodeGen/CGClass.cpp
>     cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
>     cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>     cfe/trunk/test/Parser/MicrosoftExtensions.cpp
>
> Modified: cfe/trunk/include/clang/Basic/Attr.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=227796&r1=227795&r2=227796&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Attr.td (original)
> +++ cfe/trunk/include/clang/Basic/Attr.td Mon Feb  2 04:22:20 2015
> @@ -1761,6 +1761,12 @@ def TypeTagForDatatype : InheritableAttr
>
>  // Microsoft-related attributes
>
> +def MsNoVTable : InheritableAttr {
> +  let Spellings = [Declspec<"novtable">];
> +  let Subjects = SubjectList<[CXXRecord]>;
> +  let Documentation = [Undocumented];

No undocumented attributes, please.

> +}
> +
>  def MsProperty : IgnoredAttr {
>    let Spellings = [Declspec<"property">];
>  }
>
> Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=227796&r1=227795&r2=227796&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Mon Feb  2 04:22:20 2015
> @@ -1949,6 +1949,14 @@ CodeGenFunction::InitializeVTablePointer
>                                           const CXXRecordDecl *NearestVBase,
>                                           CharUnits OffsetFromNearestVBase,
>                                           const CXXRecordDecl *VTableClass) {
> +  const CXXRecordDecl *RD = Base.getBase();
> +
> +  // Don't initialize the vtable pointer if the class is marked with the
> +  // 'novtable' attribute.
> +  if ((RD == VTableClass || RD == NearestVBase) &&
> +      VTableClass->hasAttr<MsNoVTableAttr>())
> +    return;
> +
>    // Compute the address point.
>    bool NeedsVirtualOffset;
>    llvm::Value *VTableAddressPoint =
>
> Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=227796&r1=227795&r2=227796&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original)
> +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Mon Feb  2 04:22:20 2015
> @@ -1582,7 +1582,8 @@ void MicrosoftCXXABI::emitVirtualInherit
>    for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
>      const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
>      llvm::GlobalVariable *GV = VBGlobals.Globals[I];
> -    emitVBTableDefinition(*VBT, RD, GV);
> +    if (GV->isDeclaration())
> +      emitVBTableDefinition(*VBT, RD, GV);
>    }
>  }
>
> @@ -1609,6 +1610,9 @@ MicrosoftCXXABI::getAddrOfVBTable(const
>    else if (RD->hasAttr<DLLExportAttr>())
>      GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
>
> +  if (!GV->hasExternalLinkage())
> +    emitVBTableDefinition(VBT, RD, GV);
> +
>    return GV;
>  }
>
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=227796&r1=227795&r2=227796&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon Feb  2 04:22:20 2015
> @@ -4689,6 +4689,9 @@ static void ProcessDeclAttribute(Sema &S
>      break;
>
>    // Microsoft attributes:
> +  case AttributeList::AT_MsNoVTable:
> +    handleSimpleAttribute<MsNoVTableAttr>(S, D, Attr);
> +    break;
>    case AttributeList::AT_MsStruct:
>      handleSimpleAttribute<MsStructAttr>(S, D, Attr);
>      break;
>
> Modified: cfe/trunk/test/Parser/MicrosoftExtensions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/MicrosoftExtensions.cpp?rev=227796&r1=227795&r2=227796&view=diff
> ==============================================================================
> --- cfe/trunk/test/Parser/MicrosoftExtensions.cpp (original)
> +++ cfe/trunk/test/Parser/MicrosoftExtensions.cpp Mon Feb  2 04:22:20 2015
> @@ -339,7 +339,7 @@ void TestProperty() {
>  //expected-warning at +1 {{C++ operator 'and' (aka '&&') used as a macro name}}
>  #define and foo
>
> -struct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable) IUnknown {}; // expected-warning{{__declspec attribute 'novtable' is not supported}}
> +struct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable) IUnknown {};

I would like to see some tests that ensure it accepts no arguments,
and cannot apply to something other than a CXXRecordDecl.

Thank you for implementing this!

~Aaron

>
>  typedef bool (__stdcall __stdcall *blarg)(int);
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list