Index: include/clang/Basic/TargetInfo.h =================================================================== --- include/clang/Basic/TargetInfo.h (revision 122783) +++ include/clang/Basic/TargetInfo.h (working copy) @@ -66,6 +66,7 @@ bool TLSSupported; bool NoAsmVariants; // True if {|} are normal characters. unsigned char PointerWidth, PointerAlign; + unsigned char BoolWidth, BoolAlign; unsigned char IntWidth, IntAlign; unsigned char FloatWidth, FloatAlign; unsigned char DoubleWidth, DoubleAlign; @@ -164,8 +165,8 @@ /// getBoolWidth/Align - Return the size of '_Bool' and C++ 'bool' for this /// target, in bits. - unsigned getBoolWidth(bool isWide = false) const { return 8; } // FIXME - unsigned getBoolAlign(bool isWide = false) const { return 8; } // FIXME + unsigned getBoolWidth() const { return BoolWidth; } + unsigned getBoolAlign() const { return BoolAlign; } unsigned getCharWidth() const { return 8; } // FIXME unsigned getCharAlign() const { return 8; } // FIXME Index: lib/Basic/TargetInfo.cpp =================================================================== --- lib/Basic/TargetInfo.cpp (revision 122783) +++ lib/Basic/TargetInfo.cpp (working copy) @@ -26,6 +26,7 @@ TLSSupported = true; NoAsmVariants = false; PointerWidth = PointerAlign = 32; + BoolWidth = BoolAlign = 8; IntWidth = IntAlign = 32; LongWidth = LongAlign = 32; LongLongWidth = LongLongAlign = 64; Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp (revision 122783) +++ lib/Basic/Targets.cpp (working copy) @@ -479,17 +479,6 @@ virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const; - virtual const char *getVAListDeclaration() const { - return "typedef char* __builtin_va_list;"; - // This is the right definition for ABI/V4: System V.4/eabi. - /*return "typedef struct __va_list_tag {" - " unsigned char gpr;" - " unsigned char fpr;" - " unsigned short reserved;" - " void* overflow_arg_area;" - " void* reg_save_area;" - "} __builtin_va_list[1];";*/ - } virtual void getGCCRegNames(const char * const *&Names, unsigned &NumNames) const; virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, @@ -754,8 +743,19 @@ "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32"; if (getTriple().getOS() == llvm::Triple::FreeBSD) - this->SizeType = TargetInfo::UnsignedInt; + SizeType = UnsignedInt; } + + virtual const char *getVAListDeclaration() const { + // This is the ELF definition, and is overridden by the Darwin sub-target + return "typedef struct __va_list_tag {" + " unsigned char gpr;" + " unsigned char fpr;" + " unsigned short reserved;" + " void* overflow_arg_area;" + " void* reg_save_area;" + "} __builtin_va_list[1];"; + } }; } // end anonymous namespace. @@ -770,18 +770,25 @@ DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"; } + virtual const char *getVAListDeclaration() const { + return "typedef char* __builtin_va_list;"; + } }; } // end anonymous namespace. namespace { -class DarwinPPCTargetInfo : - public DarwinTargetInfo { +class DarwinPPC32TargetInfo : + public DarwinTargetInfo { public: - DarwinPPCTargetInfo(const std::string& triple) - : DarwinTargetInfo(triple) { + DarwinPPC32TargetInfo(const std::string& triple) + : DarwinTargetInfo(triple) { HasAlignMac68kSupport = true; + BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool? } + virtual const char *getVAListDeclaration() const { + return "typedef char* __builtin_va_list;"; + } }; class DarwinPPC64TargetInfo : @@ -2578,7 +2585,7 @@ case llvm::Triple::ppc: if (os == llvm::Triple::Darwin) - return new DarwinPPCTargetInfo(T); + return new DarwinPPC32TargetInfo(T); else if (os == llvm::Triple::FreeBSD) return new FreeBSDTargetInfo(T); return new PPC32TargetInfo(T);