[cfe-commits] r131401 - in /cfe/trunk: include/clang/AST/ASTContext.h lib/AST/ASTContext.cpp test/CodeGenObjC/encode-test.m test/CodeGenObjCXX/encode.mm

Rafael Espindola rafael.espindola at gmail.com
Mon May 16 05:30:54 PDT 2011


Author: rafael
Date: Mon May 16 07:30:54 2011
New Revision: 131401

URL: http://llvm.org/viewvc/llvm-project?rev=131401&view=rev
Log:
Revert 131377, 131369 and 131365.
131365 caused PR9927.

Modified:
    cfe/trunk/include/clang/AST/ASTContext.h
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/test/CodeGenObjC/encode-test.m
    cfe/trunk/test/CodeGenObjCXX/encode.mm

Modified: cfe/trunk/include/clang/AST/ASTContext.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=131401&r1=131400&r2=131401&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/ASTContext.h (original)
+++ cfe/trunk/include/clang/AST/ASTContext.h Mon May 16 07:30:54 2011
@@ -1568,13 +1568,7 @@
                                   bool ExpandStructures,
                                   const FieldDecl *Field,
                                   bool OutermostType = false,
-                                  bool EncodingProperty = false,
-                                  bool StructField = false) const;
-
-  // Adds the encoding of the structure's members.
-  void getObjCEncodingForStructureImpl(RecordDecl *RD, std::string &S,
-                                       const FieldDecl *Field,
-                                       bool includeVBases = true) const;
+                                  bool EncodingProperty = false) const;
  
   const ASTRecordLayout &
   getObjCLayout(const ObjCInterfaceDecl *D,

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=131401&r1=131400&r2=131401&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Mon May 16 07:30:54 2011
@@ -31,7 +31,6 @@
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/raw_ostream.h"
 #include "CXXABI.h"
-#include <map>
 
 using namespace clang;
 
@@ -4153,8 +4152,7 @@
                                             bool ExpandStructures,
                                             const FieldDecl *FD,
                                             bool OutermostType,
-                                            bool EncodingProperty,
-                                            bool StructField) const {
+                                            bool EncodingProperty) const {
   if (T->getAs<BuiltinType>()) {
     if (FD && FD->isBitField())
       return EncodeBitField(this, S, T, FD);
@@ -4239,7 +4237,7 @@
   if (const ArrayType *AT =
       // Ignore type qualifiers etc.
         dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) {
-    if (isa<IncompleteArrayType>(AT) && !StructField) {
+    if (isa<IncompleteArrayType>(AT)) {
       // Incomplete arrays are encoded as a pointer to the array element.
       S += '^';
 
@@ -4248,15 +4246,11 @@
     } else {
       S += '[';
 
-      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
-        if (getTypeSize(CAT->getElementType()) == 0)
-          S += '0';
-        else
-          S += llvm::utostr(CAT->getSize().getZExtValue());
-      } else {
+      if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT))
+        S += llvm::utostr(CAT->getSize().getZExtValue());
+      else {
         //Variable length arrays are encoded as a regular array with 0 elements.
-        assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
-               "Unknown array type!");
+        assert(isa<VariableArrayType>(AT) && "Unknown array type!");
         S += '0';
       }
 
@@ -4294,30 +4288,24 @@
     }
     if (ExpandStructures) {
       S += '=';
-      if (!RDecl->isUnion()) {
-        getObjCEncodingForStructureImpl(RDecl, S, FD);
-      } else {
-        for (RecordDecl::field_iterator Field = RDecl->field_begin(),
-                                     FieldEnd = RDecl->field_end();
-             Field != FieldEnd; ++Field) {
-          if (FD) {
-            S += '"';
-            S += Field->getNameAsString();
-            S += '"';
-          }
+      for (RecordDecl::field_iterator Field = RDecl->field_begin(),
+                                   FieldEnd = RDecl->field_end();
+           Field != FieldEnd; ++Field) {
+        if (FD) {
+          S += '"';
+          S += Field->getNameAsString();
+          S += '"';
+        }
 
-          // Special case bit-fields.
-          if (Field->isBitField()) {
-            getObjCEncodingForTypeImpl(Field->getType(), S, false, true,
-                                       (*Field));
-          } else {
-            QualType qt = Field->getType();
-            getLegacyIntegralTypeEncoding(qt);
-            getObjCEncodingForTypeImpl(qt, S, false, true,
-                                       FD, /*OutermostType*/false,
-                                       /*EncodingProperty*/false,
-                                       /*StructField*/true);
-          }
+        // Special case bit-fields.
+        if (Field->isBitField()) {
+          getObjCEncodingForTypeImpl(Field->getType(), S, false, true,
+                                     (*Field));
+        } else {
+          QualType qt = Field->getType();
+          getLegacyIntegralTypeEncoding(qt);
+          getObjCEncodingForTypeImpl(qt, S, false, true,
+                                     FD);
         }
       }
     }
@@ -4438,134 +4426,6 @@
   assert(0 && "@encode for type not implemented!");
 }
 
-void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
-                                                 std::string &S,
-                                                 const FieldDecl *FD,
-                                                 bool includeVBases) const {
-  assert(RDecl && "Expected non-null RecordDecl");
-  assert(!RDecl->isUnion() && "Should not be called for unions");
-  if (!RDecl->getDefinition())
-    return;
-
-  CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
-  std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
-  const ASTRecordLayout &layout = getASTRecordLayout(RDecl);
-
-  if (CXXRec) {
-    for (CXXRecordDecl::base_class_iterator
-           BI = CXXRec->bases_begin(),
-           BE = CXXRec->bases_end(); BI != BE; ++BI) {
-      if (!BI->isVirtual()) {
-        CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
-        uint64_t offs = layout.getBaseClassOffsetInBits(base);
-        FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
-                                  std::make_pair(offs, base));
-      }
-    }
-  }
-  
-  unsigned i = 0;
-  for (RecordDecl::field_iterator Field = RDecl->field_begin(),
-                               FieldEnd = RDecl->field_end();
-       Field != FieldEnd; ++Field, ++i) {
-    uint64_t offs = layout.getFieldOffset(i);
-    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
-                              std::make_pair(offs, *Field));
-  }
-
-  if (CXXRec && includeVBases) {
-    for (CXXRecordDecl::base_class_iterator
-           BI = CXXRec->vbases_begin(),
-           BE = CXXRec->vbases_end(); BI != BE; ++BI) {
-      CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
-      uint64_t offs = layout.getVBaseClassOffsetInBits(base);
-      FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
-                                std::make_pair(offs, base));
-    }
-  }
-
-  CharUnits size;
-  if (CXXRec) {
-    size = includeVBases ? layout.getSize() : layout.getNonVirtualSize();
-  } else {
-    size = layout.getSize();
-  }
-
-  uint64_t CurOffs = 0;
-  std::multimap<uint64_t, NamedDecl *>::iterator
-    CurLayObj = FieldOrBaseOffsets.begin();
-
-  if (CurLayObj != FieldOrBaseOffsets.end() && CurLayObj->first != 0) {
-    assert(CXXRec && CXXRec->isDynamicClass() &&
-           "Offset 0 was empty but no VTable ?");
-    if (FD) {
-      S += "\"_vptr$";
-      std::string recname = CXXRec->getNameAsString();
-      if (recname.empty()) recname = "?";
-      S += recname;
-      S += '"';
-    }
-    S += "^^?";
-    CurOffs += getTypeSize(VoidPtrTy);
-  }
-
-  if (!RDecl->hasFlexibleArrayMember()) {
-    // Mark the end of the structure.
-    uint64_t offs = toBits(size);
-    FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
-                              std::make_pair(offs, (NamedDecl*)0));
-  }
-
-  for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
-    assert(CurOffs <= CurLayObj->first);
-
-    if (CurOffs < CurLayObj->first) {
-      uint64_t padding = CurLayObj->first - CurOffs; 
-      // FIXME: There doesn't seem to be a way to indicate in the encoding that
-      // packing/alignment of members is different that normal, in which case
-      // the encoding will be out-of-sync with the real layout.
-      // If the runtime switches to just consider the size of types without
-      // taking into account alignment, we could make padding explicit in the
-      // encoding (e.g. using arrays of chars). The encoding strings would be
-      // longer then though.
-      CurOffs += padding;
-    }
-
-    NamedDecl *dcl = CurLayObj->second;
-    if (dcl == 0)
-      break; // reached end of structure.
-
-    if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) {
-      // We expand the bases without their virtual bases since those are going
-      // in the initial structure. Note that this differs from gcc which
-      // expands virtual bases each time one is encountered in the hierarchy,
-      // making the encoding type bigger than it really is.
-      getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false);
-      CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
-    } else {
-      FieldDecl *field = cast<FieldDecl>(dcl);
-      if (FD) {
-        S += '"';
-        S += field->getNameAsString();
-        S += '"';
-      }
-
-      if (field->isBitField()) {
-        EncodeBitField(this, S, field->getType(), field);
-        CurOffs += field->getBitWidth()->EvaluateAsInt(*this).getZExtValue();
-      } else {
-        QualType qt = field->getType();
-        getLegacyIntegralTypeEncoding(qt);
-        getObjCEncodingForTypeImpl(qt, S, false, true, FD,
-                                   /*OutermostType*/false,
-                                   /*EncodingProperty*/false,
-                                   /*StructField*/true);
-        CurOffs += getTypeSize(field->getType());
-      }
-    }
-  }
-}
-
 void ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
                                                  std::string& S) const {
   if (QT & Decl::OBJC_TQ_In)

Modified: cfe/trunk/test/CodeGenObjC/encode-test.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/encode-test.m?rev=131401&r1=131400&r2=131401&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/encode-test.m (original)
+++ cfe/trunk/test/CodeGenObjC/encode-test.m Mon May 16 07:30:54 2011
@@ -144,20 +144,3 @@
   long double x;
 };
 const char g8[] = @encode(struct s8);
-
-// CHECK: @g9 = constant [11 x i8] c"{S9=i[0i]}\00"
-struct S9 {
-  int x;
-  int flex[];
-};
-const char g9[] = @encode(struct S9);
-
-struct f
-{
-  int i;
-  struct{} g[4];
-  int tt;
-};
-
-// CHECK: @g10 = constant [14 x i8] c"{f=i[0{?=}]i}\00"
-const char g10[] = @encode(struct f);

Modified: cfe/trunk/test/CodeGenObjCXX/encode.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/encode.mm?rev=131401&r1=131400&r2=131401&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjCXX/encode.mm (original)
+++ cfe/trunk/test/CodeGenObjCXX/encode.mm Mon May 16 07:30:54 2011
@@ -62,60 +62,3 @@
 @implementation RedBalloonHGXFormWrapper
 @end
 
-// rdar://9357400
-namespace rdar9357400 {
-  template<int Dim1 = -1, int Dim2 = -1> struct fixed {
-      template<int D> struct rebind { typedef fixed<D> other; };
-  };
-  
-  template<typename Element, int Size>
-  class fixed_1D
-  {
-  public:
-      typedef Element value_type;
-      typedef value_type array_impl[Size];
-    protected:
-      array_impl                  m_data;
-  };
-  
-  template<typename Element, typename Alloc>
-  class vector;
-  
-  template<typename Element, int Size>
-  class vector< Element, fixed<Size> >
-  : public fixed_1D<Element,Size> { };
-
-  typedef vector< float,  fixed<4> > vector4f;
-
-  // CHECK: @_ZN11rdar9357400L2ggE = internal constant [49 x i8] c"{vector<float, rdar9357400::fixed<4, -1> >=[4f]}\00"
-  const char gg[] = @encode(vector4f);
-}
-
-struct Base1 {
-  char x;
-};
-
-struct DBase : public Base1 {
-  double x;
-  virtual ~DBase();
-};
-
-struct Sub_with_virt : virtual DBase {
-  long x;
-};
-
-struct Sub2 : public Sub_with_virt, public Base1, virtual DBase {
-  float x;
-};
-
-// CHECK: @_ZL2g1 = internal constant [10 x i8] c"{Base1=c}\00"
-const char g1[] = @encode(Base1);
-
-// CHECK: @_ZL2g2 = internal constant [14 x i8] c"{DBase=^^?cd}\00"
-const char g2[] = @encode(DBase);
-
-// CHECK: @_ZL2g3 = internal constant [26 x i8] c"{Sub_with_virt=^^?q^^?cd}\00"
-const char g3[] = @encode(Sub_with_virt);
-
-// CHECK: @_ZL2g4 = internal constant [19 x i8] c"{Sub2=^^?qcf^^?cd}\00"
-const char g4[] = @encode(Sub2);





More information about the cfe-commits mailing list