]> granicus.if.org Git - clang/commitdiff
Connect ASTContext to TargetInfo when determining the size_t, ptrdiff_t, and wchar_t...
authorDouglas Gregor <dgregor@apple.com>
Mon, 3 Nov 2008 14:12:49 +0000 (14:12 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 3 Nov 2008 14:12:49 +0000 (14:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58609 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp

index b30fbfa4441325058b351f2c61e77ca7da998748..9f3d69068305149d82a9fab32d66d15be9fda41d 100644 (file)
@@ -15,6 +15,7 @@
 #define LLVM_CLANG_AST_ASTCONTEXT_H
 
 #include "clang/Basic/LangOptions.h"
+#include "clang/Basic/TargetInfo.h"
 #include "clang/AST/Builtins.h"
 #include "clang/AST/DeclBase.h"
 #include "clang/AST/Type.h"
@@ -33,7 +34,6 @@ namespace clang {
   class ASTRecordLayout;
   class Expr;
   class IdentifierTable;
-  class TargetInfo;
   class SelectorTable;
   class SourceManager;
   // Decls
@@ -319,6 +319,8 @@ public:
   void setBuiltinVaListType(QualType T);
   QualType getBuiltinVaListType() const { return BuiltinVaListType; }
     
+  QualType getFromTargetType(TargetInfo::IntType Type) const;
+
   //===--------------------------------------------------------------------===//
   //                         Type Predicates.
   //===--------------------------------------------------------------------===//
index 095414bde1036e116393adc50098791629709976..0e250281a024304fd2556c49750392c21beb2570 100644 (file)
@@ -1090,9 +1090,7 @@ QualType ASTContext::getTagDeclType(TagDecl *Decl) {
 /// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and 
 /// needs to agree with the definition in <stddef.h>. 
 QualType ASTContext::getSizeType() const {
-  // On Darwin, size_t is defined as a "long unsigned int". 
-  // FIXME: should derive from "Target".
-  return UnsignedLongTy; 
+  return getFromTargetType(Target.getSizeType());
 }
 
 /// getWCharType - Return the unique type for "wchar_t" (C99 7.17), the
@@ -1102,9 +1100,9 @@ QualType ASTContext::getWCharType() const {
   if (LangOpts.CPlusPlus)
     return WCharTy;
 
-  // On Darwin, wchar_t is defined as a "int". 
-  // FIXME: should derive from "Target".
-  return IntTy; 
+  // FIXME: In C, shouldn't WCharTy just be a typedef of the target's
+  // wide-character type?
+  return getFromTargetType(Target.getWCharType());
 }
 
 /// getSignedWCharType - Return the type of "signed wchar_t".
@@ -1124,9 +1122,7 @@ QualType ASTContext::getUnsignedWCharType() const {
 /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?)
 /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
 QualType ASTContext::getPointerDiffType() const {
-  // On Darwin, ptrdiff_t is defined as a "int". This seems like a bug...
-  // FIXME: should derive from "Target".
-  return IntTy; 
+  return getFromTargetType(Target.getPtrDiffType(0));
 }
 
 //===----------------------------------------------------------------------===//
@@ -1796,6 +1792,23 @@ void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
   ObjCConstantStringType = getObjCInterfaceType(Decl);
 }
 
+/// getFromTargetType - Given one of the integer types provided by
+/// TargetInfo, produce the corresponding type.
+QualType ASTContext::getFromTargetType(TargetInfo::IntType Type) const {
+  switch (Type) {
+  case TargetInfo::NoInt: return QualType(); 
+  case TargetInfo::SignedShort: return ShortTy;
+  case TargetInfo::UnsignedShort: return UnsignedShortTy;
+  case TargetInfo::SignedInt: return IntTy;
+  case TargetInfo::UnsignedInt: return UnsignedIntTy;
+  case TargetInfo::SignedLong: return LongTy;
+  case TargetInfo::UnsignedLong: return UnsignedLongTy;
+  case TargetInfo::SignedLongLong: return LongLongTy;
+  case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
+  }
+
+  assert(false && "Unhandled TargetInfo::IntType value");
+}
 
 //===----------------------------------------------------------------------===//
 //                        Type Predicates.