[cfe-commits] r90331 - in /cfe/trunk/lib/CodeGen: CGRTTI.cpp CGRtti.cpp CMakeLists.txt

Mike Stump mrs at apple.com
Wed Dec 2 10:32:08 PST 2009


Author: mrs
Date: Wed Dec  2 12:32:08 2009
New Revision: 90331

URL: http://llvm.org/viewvc/llvm-project?rev=90331&view=rev
Log:
Rename CGRtti.cpp to CGRTTI.cpp.

Added:
    cfe/trunk/lib/CodeGen/CGRTTI.cpp
      - copied unchanged from r90328, cfe/trunk/lib/CodeGen/CGRtti.cpp
Removed:
    cfe/trunk/lib/CodeGen/CGRtti.cpp
Modified:
    cfe/trunk/lib/CodeGen/CMakeLists.txt

Removed: cfe/trunk/lib/CodeGen/CGRtti.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRtti.cpp?rev=90330&view=auto

==============================================================================
--- cfe/trunk/lib/CodeGen/CGRtti.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGRtti.cpp (removed)
@@ -1,426 +0,0 @@
-//===--- CGCXXRtti.cpp - Emit LLVM Code for C++ RTTI descriptors ----------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This contains code dealing with C++ code generation of RTTI descriptors.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/AST/Type.h"
-#include "clang/AST/RecordLayout.h"
-#include "CodeGenModule.h"
-using namespace clang;
-using namespace CodeGen;
-
-class RttiBuilder {
-  CodeGenModule &CGM;  // Per-module state.
-  llvm::LLVMContext &VMContext;
-  const llvm::Type *Int8PtrTy;
-  llvm::SmallSet<const CXXRecordDecl *, 16> SeenVBase;
-  llvm::SmallSet<const CXXRecordDecl *, 32> SeenBase;
-public:
-  RttiBuilder(CodeGenModule &cgm)
-    : CGM(cgm), VMContext(cgm.getModule().getContext()),
-      Int8PtrTy(llvm::Type::getInt8PtrTy(VMContext)) { }
-
-  /// BuildVtableRef - Build a reference to a vtable.
-  llvm::Constant *BuildVtableRef(const char *Name) {
-    // Build a descriptor for Name
-    llvm::Constant *GV = CGM.getModule().getGlobalVariable(Name);
-    if (GV)
-      GV = llvm::ConstantExpr::getBitCast(GV,
-                                          llvm::PointerType::get(Int8PtrTy, 0));
-    else {
-      llvm::GlobalVariable::LinkageTypes linktype;
-      linktype = llvm::GlobalValue::ExternalLinkage;
-      GV = new llvm::GlobalVariable(CGM.getModule(), Int8PtrTy,
-                                    true, linktype, 0, Name);
-    }
-    llvm::Constant *C;
-    C = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), 2);
-    C = llvm::ConstantExpr::getInBoundsGetElementPtr(GV, &C, 1);
-    return llvm::ConstantExpr::getBitCast(C, Int8PtrTy);
-  }
-
-  llvm::Constant *BuildName(QualType Ty, bool Hidden, bool Extern) {
-    llvm::SmallString<256> OutName;
-    CGM.getMangleContext().mangleCXXRttiName(Ty, OutName);
-    llvm::StringRef Name = OutName.str();
-
-    llvm::GlobalVariable::LinkageTypes linktype;
-    linktype = llvm::GlobalValue::LinkOnceODRLinkage;
-    if (!Extern)
-      linktype = llvm::GlobalValue::InternalLinkage;
-
-    llvm::GlobalVariable *GV;
-    GV = CGM.getModule().getGlobalVariable(Name);
-    if (GV && !GV->isDeclaration())
-      return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
-
-    llvm::Constant *C;
-    C = llvm::ConstantArray::get(VMContext, Name.substr(4));
-
-    llvm::GlobalVariable *OGV = GV;
-    GV = new llvm::GlobalVariable(CGM.getModule(), C->getType(), true, linktype,
-                                  C, Name);
-    if (OGV) {
-      GV->takeName(OGV);
-      llvm::Constant *NewPtr = llvm::ConstantExpr::getBitCast(GV,
-                                                              OGV->getType());
-      OGV->replaceAllUsesWith(NewPtr);
-      OGV->eraseFromParent();
-    }
-    if (Hidden)
-      GV->setVisibility(llvm::GlobalVariable::HiddenVisibility);
-    return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
-  };
-
-  /// - BuildFlags - Build a psABI __flags value for __vmi_class_type_info.
-  llvm::Constant *BuildFlags(int f) {
-    return llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), f);
-  }
-
-  /// BuildBaseCount - Build a psABI __base_count value for
-  /// __vmi_class_type_info.
-  llvm::Constant *BuildBaseCount(unsigned c) {
-    return llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), c);
-  }
-
-  llvm::Constant *BuildTypeRef(QualType Ty) {
-    llvm::Constant *C;
-
-    if (!CGM.getContext().getLangOptions().Rtti)
-      return llvm::Constant::getNullValue(Int8PtrTy);
-
-    llvm::SmallString<256> OutName;
-    CGM.getMangleContext().mangleCXXRtti(Ty, OutName);
-    llvm::StringRef Name = OutName.str();
-
-    C = CGM.getModule().getGlobalVariable(Name);
-    if (C)
-      return llvm::ConstantExpr::getBitCast(C, Int8PtrTy);
-
-    llvm::GlobalVariable::LinkageTypes linktype;
-    linktype = llvm::GlobalValue::ExternalLinkage;;
-
-    C = new llvm::GlobalVariable(CGM.getModule(), Int8PtrTy, true, linktype,
-                                 0, Name);
-    return llvm::ConstantExpr::getBitCast(C, Int8PtrTy);
-  }
-
-  llvm::Constant *Buildclass_type_infoRef(const CXXRecordDecl *RD) {
-    return BuildTypeRef(CGM.getContext().getTagDeclType(RD));
-  }
-
-  /// CalculateFlags - Calculate the flags for the __vmi_class_type_info
-  /// datastructure.  1 for non-diamond repeated inheritance, 2 for a dimond
-  /// shaped class.
-  int CalculateFlags(const CXXRecordDecl*RD) {
-    int flags = 0;
-    if (SeenBase.count(RD))
-      flags |= 1;
-    else
-      SeenBase.insert(RD);
-    for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
-           e = RD->bases_end(); i != e; ++i) {
-      const CXXRecordDecl *Base =
-        cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-      if (i->isVirtual()) {
-        if (SeenVBase.count(Base))
-          flags |= 2;
-        else
-          SeenVBase.insert(Base);
-      }
-      flags |= CalculateFlags(Base);
-    }
-    return flags;
-  }
-
-  bool SimpleInheritance(const CXXRecordDecl *RD) {
-    if (RD->getNumBases() != 1)
-      return false;
-    CXXRecordDecl::base_class_const_iterator i = RD->bases_begin();
-    if (i->isVirtual())
-      return false;
-    if (i->getAccessSpecifier() != AS_public)
-      return false;
-
-    const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
-    const CXXRecordDecl *Base =
-      cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-    if (Layout.getBaseClassOffset(Base) != 0)
-      return false;
-    return true;
-  }
-
-  llvm::Constant *finish(std::vector<llvm::Constant *> &info,
-                         llvm::GlobalVariable *GV,
-                         llvm::StringRef Name, bool Hidden, bool Extern) {
-    llvm::GlobalVariable::LinkageTypes linktype;
-    linktype = llvm::GlobalValue::LinkOnceODRLinkage;
-    if (!Extern)
-      linktype = llvm::GlobalValue::InternalLinkage;
-
-    llvm::Constant *C;
-    C = llvm::ConstantStruct::get(VMContext, &info[0], info.size(), false);
-
-    llvm::GlobalVariable *OGV = GV;
-    GV = new llvm::GlobalVariable(CGM.getModule(), C->getType(), true, linktype,
-                                  C, Name);
-    if (OGV) {
-      GV->takeName(OGV);
-      llvm::Constant *NewPtr = llvm::ConstantExpr::getBitCast(GV,
-                                                              OGV->getType());
-      OGV->replaceAllUsesWith(NewPtr);
-      OGV->eraseFromParent();
-    }
-    if (Hidden)
-      GV->setVisibility(llvm::GlobalVariable::HiddenVisibility);
-    return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
-  }
-
-
-  llvm::Constant *Buildclass_type_info(const CXXRecordDecl *RD) {
-    if (!CGM.getContext().getLangOptions().Rtti)
-      return llvm::Constant::getNullValue(Int8PtrTy);
-
-    llvm::Constant *C;
-
-    llvm::SmallString<256> OutName;
-    CGM.getMangleContext().mangleCXXRtti(CGM.getContext().getTagDeclType(RD),
-                                         OutName);
-    llvm::StringRef Name = OutName.str();
-
-    llvm::GlobalVariable *GV;
-    GV = CGM.getModule().getGlobalVariable(Name);
-    if (GV && !GV->isDeclaration())
-      return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
-
-    std::vector<llvm::Constant *> info;
-
-    bool Hidden = CGM.getDeclVisibilityMode(RD) == LangOptions::Hidden;
-    bool Extern = !RD->isInAnonymousNamespace();
-
-    bool simple = false;
-    if (RD->getNumBases() == 0)
-      C = BuildVtableRef("_ZTVN10__cxxabiv117__class_type_infoE");
-    else if (SimpleInheritance(RD)) {
-      simple = true;
-      C = BuildVtableRef("_ZTVN10__cxxabiv120__si_class_type_infoE");
-    } else
-      C = BuildVtableRef("_ZTVN10__cxxabiv121__vmi_class_type_infoE");
-    info.push_back(C);
-    info.push_back(BuildName(CGM.getContext().getTagDeclType(RD), Hidden,
-                             Extern));
-
-    // If we have no bases, there are no more fields.
-    if (RD->getNumBases()) {
-      if (!simple) {
-        info.push_back(BuildFlags(CalculateFlags(RD)));
-        info.push_back(BuildBaseCount(RD->getNumBases()));
-      }
-
-      const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
-      for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
-             e = RD->bases_end(); i != e; ++i) {
-        const CXXRecordDecl *Base =
-          cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-        info.push_back(CGM.GenerateRttiRef(Base));
-        if (simple)
-          break;
-        int64_t offset;
-        if (!i->isVirtual())
-          offset = Layout.getBaseClassOffset(Base)/8;
-        else
-          offset = CGM.getVtableInfo().getVirtualBaseOffsetIndex(RD, Base);
-        offset <<= 8;
-        // Now set the flags.
-        offset += i->isVirtual() ? 1 : 0;;
-        offset += i->getAccessSpecifier() == AS_public ? 2 : 0;
-        const llvm::Type *LongTy =
-          CGM.getTypes().ConvertType(CGM.getContext().LongTy);
-        C = llvm::ConstantInt::get(LongTy, offset);
-        info.push_back(C);
-      }
-    }
-
-    return finish(info, GV, Name, Hidden, Extern);
-  }
-
-  /// - BuildFlags - Build a __flags value for __pbase_type_info.
-  llvm::Constant *BuildInt(int f) {
-    return llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), f);
-  }
-
-  bool DecideExtern(QualType Ty) {
-    // For this type, see if all components are never in an anonymous namespace.
-    if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>())
-      return (DecideExtern(MPT->getPointeeType())
-              && DecideExtern(QualType(MPT->getClass(), 0)));
-    if (const PointerType *PT = Ty->getAs<PointerType>())
-      return DecideExtern(PT->getPointeeType());
-    if (const RecordType *RT = Ty->getAs<RecordType>())
-      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
-        return !RD->isInAnonymousNamespace();
-    return true;
-  }
-
-  bool DecideHidden(QualType Ty) {
-    // For this type, see if all components are never hidden.
-    if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>())
-      return (DecideHidden(MPT->getPointeeType())
-              && DecideHidden(QualType(MPT->getClass(), 0)));
-    if (const PointerType *PT = Ty->getAs<PointerType>())
-      return DecideHidden(PT->getPointeeType());
-    if (const RecordType *RT = Ty->getAs<RecordType>())
-      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
-        return CGM.getDeclVisibilityMode(RD) == LangOptions::Hidden;
-    return false;
-  }
-
-  llvm::Constant *BuildPointerType(QualType Ty) {
-    llvm::Constant *C;
-
-    llvm::SmallString<256> OutName;
-    CGM.getMangleContext().mangleCXXRtti(Ty, OutName);
-    llvm::StringRef Name = OutName.str();
-
-    llvm::GlobalVariable *GV;
-    GV = CGM.getModule().getGlobalVariable(Name);
-    if (GV && !GV->isDeclaration())
-      return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
-
-    std::vector<llvm::Constant *> info;
-
-    bool Extern = DecideExtern(Ty);
-    bool Hidden = DecideHidden(Ty);
-
-    QualType PTy = Ty->getPointeeType();
-    QualType BTy;
-    bool PtrMem = false;
-    if (const MemberPointerType *MPT = dyn_cast<MemberPointerType>(Ty)) {
-      PtrMem = true;
-      BTy = QualType(MPT->getClass(), 0);
-      PTy = MPT->getPointeeType();
-    }
-
-    if (PtrMem)
-      C = BuildVtableRef("_ZTVN10__cxxabiv129__pointer_to_member_type_infoE");
-    else
-      C = BuildVtableRef("_ZTVN10__cxxabiv119__pointer_type_infoE");
-    info.push_back(C);
-    info.push_back(BuildName(Ty, Hidden, Extern));
-    Qualifiers Q = PTy.getQualifiers();
-    PTy = CGM.getContext().getCanonicalType(PTy).getUnqualifiedType();
-    int flags = 0;
-    flags += Q.hasConst() ? 0x1 : 0;
-    flags += Q.hasVolatile() ? 0x2 : 0;
-    flags += Q.hasRestrict() ? 0x4 : 0;
-    flags += Ty.getTypePtr()->isIncompleteType() ? 0x8 : 0;
-    if (PtrMem && BTy.getTypePtr()->isIncompleteType())
-      flags += 0x10;
-
-    info.push_back(BuildInt(flags));
-    info.push_back(BuildInt(0));
-    info.push_back(BuildType(PTy));
-
-    if (PtrMem)
-      info.push_back(BuildType(BTy));
-
-    // We always generate these as hidden, only the name isn't hidden.
-    return finish(info, GV, Name, true, Extern);
-  }
-
-  llvm::Constant *BuildSimpleType(QualType Ty, const char *vtbl) {
-    llvm::Constant *C;
-
-    llvm::SmallString<256> OutName;
-    CGM.getMangleContext().mangleCXXRtti(Ty, OutName);
-    llvm::StringRef Name = OutName.str();
-
-    llvm::GlobalVariable *GV;
-    GV = CGM.getModule().getGlobalVariable(Name);
-    if (GV && !GV->isDeclaration())
-      return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
-
-    std::vector<llvm::Constant *> info;
-
-    bool Extern = DecideExtern(Ty);
-    bool Hidden = DecideHidden(Ty);
-
-    C = BuildVtableRef(vtbl);
-    info.push_back(C);
-    info.push_back(BuildName(Ty, Hidden, Extern));
-
-    // We always generate these as hidden, only the name isn't hidden.
-    return finish(info, GV, Name, true, Extern);
-  }
-
-  llvm::Constant *BuildType(QualType Ty) {
-    const clang::Type &Type
-      = *CGM.getContext().getCanonicalType(Ty).getTypePtr();
-
-    if (const RecordType *RT = Ty.getTypePtr()->getAs<RecordType>())
-      if (const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()))
-        return Buildclass_type_info(RD);
-
-    switch (Type.getTypeClass()) {
-    default: {
-      assert(0 && "typeid expression");
-      return llvm::Constant::getNullValue(Int8PtrTy);
-    }
-
-    case Type::Builtin: {
-      // We expect all type_info objects for builtin types to be in the library.
-      return BuildTypeRef(Ty);
-    }
-
-    case Type::Pointer: {
-      QualType PTy = Ty->getPointeeType();
-      Qualifiers Q = PTy.getQualifiers();
-      Q.removeConst();
-      // T* and const T* for all builtin types T are expected in the library.
-      if (isa<BuiltinType>(PTy) && Q.empty())
-        return BuildTypeRef(Ty);
-
-      return BuildPointerType(Ty);
-    }
-    case Type::MemberPointer:
-      return BuildPointerType(Ty);
-    case Type::FunctionProto:
-    case Type::FunctionNoProto:
-      return BuildSimpleType(Ty, "_ZTVN10__cxxabiv120__function_type_infoE");
-    case Type::ConstantArray:
-    case Type::IncompleteArray:
-    case Type::VariableArray:
-    case Type::Vector:
-    case Type::ExtVector:
-      return BuildSimpleType(Ty, "_ZTVN10__cxxabiv117__array_type_infoE");
-    case Type::Enum:
-      return BuildSimpleType(Ty, "_ZTVN10__cxxabiv116__enum_type_infoE");
-    }
-  }
-};
-
-llvm::Constant *CodeGenModule::GenerateRttiRef(const CXXRecordDecl *RD) {
-  RttiBuilder b(*this);
-
-  return b.Buildclass_type_infoRef(RD);
-}
-
-llvm::Constant *CodeGenModule::GenerateRtti(const CXXRecordDecl *RD) {
-  RttiBuilder b(*this);
-
-  return b.Buildclass_type_info(RD);
-}
-
-llvm::Constant *CodeGenModule::GenerateRtti(QualType Ty) {
-  RttiBuilder b(*this);
-
-  return b.BuildType(Ty);
-}

Modified: cfe/trunk/lib/CodeGen/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CMakeLists.txt?rev=90331&r1=90330&r2=90331&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CMakeLists.txt (original)
+++ cfe/trunk/lib/CodeGen/CMakeLists.txt Wed Dec  2 12:32:08 2009
@@ -19,7 +19,7 @@
   CGObjCGNU.cpp
   CGObjCMac.cpp
   CGRecordLayoutBuilder.cpp
-  CGRtti.cpp
+  CGRTTI.cpp
   CGStmt.cpp
   CGTemporaries.cpp
   CGVtable.cpp





More information about the cfe-commits mailing list