implement proper support for _Bool in memory, which is usually i8, not i1.

This fixes a crash reported by Seo Sanghyeon

llvm-svn: 45778
This commit is contained in:
Chris Lattner 2008-01-09 18:47:25 +00:00
parent 6fa7516bc9
commit 41a1ef0dfe
6 changed files with 48 additions and 8 deletions

View File

@ -71,7 +71,7 @@ void CodeGenFunction::EmitStaticBlockVarDecl(const BlockVarDecl &D) {
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);

View File

@ -121,7 +121,7 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
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());

View File

@ -149,6 +149,25 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) {
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();
@ -165,8 +184,7 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) {
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:

View File

@ -118,16 +118,26 @@ public:
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,

View File

@ -233,6 +233,12 @@ public:
///===---- 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);

View File

@ -26,3 +26,9 @@ char *test(int c) {
return c ? buf : bufptr;
}
_Bool booltest = 0;
void booltest2() {
static _Bool booltest3 = 4;
}