[cfe-commits] r77556 - in /cfe/trunk: lib/AST/RecordLayoutBuilder.cpp lib/AST/RecordLayoutBuilder.h lib/CodeGen/CodeGenTypes.cpp test/CodeGenCXX/virt.cpp

Fariborz Jahanian fjahanian at apple.com
Wed Jul 29 20:31:54 PDT 2009


On Jul 29, 2009, at 5:22 PM, Mike Stump wrote:

> Author: mrs
> Date: Wed Jul 29 19:22:38 2009
> New Revision: 77556
>
> URL: http://llvm.org/viewvc/llvm-project?rev=77556&view=rev
> Log:
> Add ability to layout the vtable pointer in trivial cases.  I noticed
> that we would silently do bad things with virtual bases in the layout
> code, so, we just turn them off.  When people do better things with
> them, we can turn them back on.
>
> Added:
>    cfe/trunk/test/CodeGenCXX/virt.cpp
> Modified:
>    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
>    cfe/trunk/lib/AST/RecordLayoutBuilder.h
>    cfe/trunk/lib/CodeGen/CodeGenTypes.cpp
>
> Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=77556&r1=77555&r2=77556&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
> +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Wed Jul 29 19:22:38 2009
> @@ -24,11 +24,19 @@
>   : Ctx(Ctx), Size(0), Alignment(8), StructPacking(0), NextOffset(0),
>   IsUnion(false), NonVirtualSize(0), NonVirtualAlignment(8) {}
>
> +void ASTRecordLayoutBuilder::LayoutVtable(const CXXRecordDecl *RD) {
> +  if (RD->isPolymorphic())
> +    {
> +      assert (RD->getNumBases() == 0 && "no polymorphic inheritance  
> yet");
> +      int AS = 0;
> +      UpdateAlignment(Ctx.Target.getPointerAlign(AS));
> +      Size += Ctx.Target.getPointerWidth(AS);
> +      NextOffset = Size;

No need for AS; just use 0.

>
> +    }
> +}
> +
> void
> ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl  
> *RD) {
> -  assert(!RD->isPolymorphic() &&
> -         "FIXME: We don't support polymorphic classes yet!");
> -
>   for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
>        e = RD->bases_end(); i != e; ++i) {
>     if (!i->isVirtual()) {
> @@ -74,14 +82,20 @@
>     UpdateAlignment(AA->getAlignment());
>
>   // If this is a C++ class, lay out the nonvirtual bases.
> -  if (Ctx.getLangOptions().CPlusPlus)
> -    LayoutNonVirtualBases(cast<CXXRecordDecl>(D));
> +  if (Ctx.getLangOptions().CPlusPlus) {
> +    const CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
> +    LayoutVtable(RD);
> +    LayoutNonVirtualBases(RD);

Why check for c++? Do we get CXXRecordDecl AST in other languages I  
wonder?

- fariborz



>
> +
> +    assert (RD->getNumVBases() == 0
> +            && "FIXME: We don't support virtual bases yet!");
> +  }
>
>   LayoutFields(D);
>
>   NonVirtualSize = Size;
>   NonVirtualAlignment = Alignment;
> -
> +
>   // Finally, round the size of the total struct up to the alignment  
> of the
>   // struct itself.
>   FinishLayout();
>
> Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.h?rev=77556&r1=77555&r2=77556&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/AST/RecordLayoutBuilder.h (original)
> +++ cfe/trunk/lib/AST/RecordLayoutBuilder.h Wed Jul 29 19:22:38 2009
> @@ -48,6 +48,7 @@
>   void LayoutFields(const RecordDecl *D);
>   void LayoutField(const FieldDecl *D);
>
> +  void LayoutVtable(const CXXRecordDecl *RD);
>   void LayoutNonVirtualBases(const CXXRecordDecl *RD);
>   void LayoutNonVirtualBase(const CXXRecordDecl *RD);
>
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenTypes.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTypes.cpp?rev=77556&r1=77555&r2=77556&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenTypes.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenTypes.cpp Wed Jul 29 19:22:38 2009
> @@ -381,8 +381,6 @@
>
>   // FIXME. This may have to move to a better place.
>   if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TD)) {
> -    assert(!RD->isPolymorphic() &&
> -           "FIXME: We don't support polymorphic classes yet!");
>     for (CXXRecordDecl::base_class_const_iterator i = RD- 
> >bases_begin(),
>          e = RD->bases_end(); i != e; ++i) {
>       if (!i->isVirtual()) {
>
> Added: cfe/trunk/test/CodeGenCXX/virt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/virt.cpp?rev=77556&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/CodeGenCXX/virt.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/virt.cpp Wed Jul 29 19:22:38 2009
> @@ -0,0 +1,8 @@
> +// RUN: clang-cc %s -emit-llvm -o - -std=c++0x
> +
> +class A {
> +public:
> +  virtual void foo();
> +};
> +
> +static_assert (sizeof (A) == (sizeof(void *)), "vtable pointer  
> layout");
>
>
> _______________________________________________
> 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