On Mon, Feb 2, 2015 at 2:07 PM, David Majnemer <[email protected]> wrote: > Done in r227838.
Thanks! Looks great to me! ~Aaron > > On Mon, Feb 2, 2015 at 4:40 AM, Aaron Ballman <[email protected]> > wrote: >> >> On Mon, Feb 2, 2015 at 5:22 AM, David Majnemer <[email protected]> >> 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@+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 >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
