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