Skip to content
ASTContext.cpp 2.51 KiB
Newer Older
//===--- ASTContext.cpp - Context to hold long-lived AST nodes ------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by Chris Lattner and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  This file implements the ASTContext interface.
//
//===----------------------------------------------------------------------===//

#include "clang/AST/ASTContext.h"
#include "clang/Lex/Preprocessor.h"
using namespace llvm;
using namespace clang;

ASTContext::ASTContext(Preprocessor &pp)
  : PP(pp), Target(pp.getTargetInfo()) {
  InitBuiltinTypes();
}

void ASTContext::InitBuiltinTypes() {
  assert(VoidTy.isNull() && "Context reinitialized?");
  
  // C99 6.2.5p19.
  Types.push_back(VoidTy = new BuiltinType("void"));
  
  // C99 6.2.5p2.
  Types.push_back(BoolTy = new BuiltinType("_Bool"));
  // C99 6.2.5p3.
  Types.push_back(CharTy = new BuiltinType("char"));
  // C99 6.2.5p4.
  Types.push_back(SignedCharTy = new BuiltinType("signed char"));
  Types.push_back(ShortTy = new BuiltinType("short"));
  Types.push_back(IntTy = new BuiltinType("int"));
  Types.push_back(LongTy = new BuiltinType("long"));
  Types.push_back(LongLongTy = new BuiltinType("long long"));
  
  // C99 6.2.5p6.
  Types.push_back(UnsignedCharTy = new BuiltinType("unsigned char"));
  Types.push_back(UnsignedShortTy = new BuiltinType("unsigned short"));
  Types.push_back(UnsignedIntTy = new BuiltinType("unsigned int"));
  Types.push_back(UnsignedLongTy = new BuiltinType("unsigned long"));
  Types.push_back(UnsignedLongLongTy = new BuiltinType("unsigned long long"));
  
  // C99 6.2.5p10.
  Types.push_back(FloatTy = new BuiltinType("float"));
  Types.push_back(DoubleTy = new BuiltinType("double"));
  Types.push_back(LongDoubleTy = new BuiltinType("long double"));
  
  // C99 6.2.5p11.
  Types.push_back(FloatComplexTy = new BuiltinType("float _Complex"));
  Types.push_back(DoubleComplexTy = new BuiltinType("double _Complex"));
  Types.push_back(LongDoubleComplexTy= new BuiltinType("long double _Complex"));
}

/// getPointerType - Return the uniqued reference to the type for a pointer to
/// the specified type.
TypeRef ASTContext::getPointerType(const TypeRef &T) {
  // FIXME: memoize these.
  
  
  
  Type *Canonical = 0;
  if (!T->isCanonical())
    Canonical = getPointerType(T.getCanonicalType()).getTypePtr();
  return new PointerType(T, Canonical);