llvm::Value *&DMEntry = LocalDeclMap[&D];
assert(DMEntry == 0 && "Decl already exists in localdeclmap!");
- const llvm::Type *LTy = ConvertType(Ty);
+ const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
llvm::Constant *Init = 0;
if (D.getInit() == 0) {
Init = llvm::Constant::getNullValue(LTy);
llvm::Constant *&Entry = GlobalDeclMap[D];
if (Entry) return Entry;
- const llvm::Type *Ty = getTypes().ConvertType(D->getType());
+ const llvm::Type *Ty = getTypes().ConvertTypeForMem(D->getType());
// Check to see if the global already exists.
llvm::GlobalVariable *GV = getModule().getGlobalVariable(D->getName());
return ResultType;
}
+/// ConvertTypeForMem - Convert type T into a llvm::Type. Maintain and use
+/// type cache through TypeHolderMap. This differs from ConvertType in that
+/// it is used to convert to the memory representation for a type. For
+/// example, the scalar representation for _Bool is i1, but the memory
+/// representation is usually i8 or i32, depending on the target.
+const llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T) {
+ const llvm::Type *R = ConvertType(T);
+
+ // If this is a non-bool type, don't map it.
+ if (R != llvm::Type::Int1Ty)
+ return R;
+
+ // Otherwise, return an integer of the target-specified size.
+ unsigned BoolWidth = (unsigned)Context.getTypeSize(T, SourceLocation());
+ return llvm::IntegerType::get(BoolWidth);
+
+}
+
+
const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
const clang::Type &Ty = *T.getCanonicalType();
return llvm::IntegerType::get(8);
case BuiltinType::Bool:
- // FIXME: This is very strange. We want scalars to be i1, but in memory
- // they can be i1 or i32. Should the codegen handle this issue?
+ // Note that we always return bool as i1 for use as a scalar type.
return llvm::Type::Int1Ty;
case BuiltinType::Char_S:
ASTContext &getContext() const { return Context; }
/// ConvertType - Convert type T into a llvm::Type. Maintain and use
- /// type cache through TypeHOlderMap.
+ /// type cache through TypeHolderMap.
const llvm::Type *ConvertType(QualType T);
- void DecodeArgumentTypes(const FunctionTypeProto &FTP,
- std::vector<const llvm::Type*> &ArgTys);
-
+
+ /// ConvertTypeForMem - Convert type T into a llvm::Type. Maintain and use
+ /// type cache through TypeHolderMap. This differs from ConvertType in that
+ /// it is used to convert to the memory representation for a type. For
+ /// example, the scalar representation for _Bool is i1, but the memory
+ /// representation is usually i8 or i32, depending on the target.
+ const llvm::Type *ConvertTypeForMem(QualType T);
+
+
const CGRecordLayout *getCGRecordLayout(const llvm::Type*) const;
/// getLLVMFieldNo - Return llvm::StructType element number
/// that corresponds to the field FD.
unsigned getLLVMFieldNo(const FieldDecl *FD);
+
+public: // These are internal details of CGT that shouldn't be used externally.
+ void DecodeArgumentTypes(const FunctionTypeProto &FTP,
+ std::vector<const llvm::Type*> &ArgTys);
/// addFieldInfo - Assign field number to field FD.
void addFieldInfo(const FieldDecl *FD, unsigned No, unsigned Begin,
///===---- Some helper methods ------------------------------------------===//
+ unsigned getBoolWidth(FullSourceLoc Loc) {
+ uint64_t Size; unsigned Align;
+ getBoolInfo(Size, Align, Loc);
+ return static_cast<unsigned>(Size);
+ }
+
unsigned getCharWidth(FullSourceLoc Loc) {
uint64_t Size; unsigned Align;
getCharInfo(Size, Align, Loc);
return c ? buf : bufptr;
}
+
+_Bool booltest = 0;
+void booltest2() {
+ static _Bool booltest3 = 4;
+}
+