r227796 - MS ABI: Implement support for 'novtable'

David Majnemer david.majnemer at gmail.com
Mon Feb 2 11:07:57 PST 2015


Done in r227838.

On Mon, Feb 2, 2015 at 4:40 AM, Aaron Ballman <aaron at aaronballman.com>
wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150202/40e9c4ed/attachment.html>


More information about the cfe-commits mailing list