Done in r227838. 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
