//===--- 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 "CodeGenModule.h"
using namespace clang;
using namespace CodeGen;

llvm::Constant *CodeGenModule::GenerateRtti(const CXXRecordDecl *RD) {
  const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);

  if (!getContext().getLangOptions().Rtti)
    return llvm::Constant::getNullValue(Int8PtrTy);

  llvm::SmallString<256> OutName;
  llvm::raw_svector_ostream Out(OutName);
  mangleCXXRtti(getMangleContext(), Context.getTagDeclType(RD), Out);
  
  llvm::GlobalVariable::LinkageTypes linktype;
  linktype = llvm::GlobalValue::WeakAnyLinkage;
  std::vector<llvm::Constant *> info;
  // assert(0 && "FIXME: implement rtti descriptor");
  // FIXME: descriptor
  info.push_back(llvm::Constant::getNullValue(Int8PtrTy));
  // assert(0 && "FIXME: implement rtti ts");
  // FIXME: TS
  info.push_back(llvm::Constant::getNullValue(Int8PtrTy));

  llvm::Constant *C;
  llvm::ArrayType *type = llvm::ArrayType::get(Int8PtrTy, info.size());
  C = llvm::ConstantArray::get(type, info);
  llvm::Constant *Rtti = 
    new llvm::GlobalVariable(getModule(), type, true, linktype, C,
                             Out.str());
  Rtti = llvm::ConstantExpr::getBitCast(Rtti, Int8PtrTy);
  return Rtti;
}
