Index: include/clang/Basic/TargetInfo.h =================================================================== --- include/clang/Basic/TargetInfo.h +++ include/clang/Basic/TargetInfo.h @@ -283,7 +283,7 @@ unsigned getLongLongAlign() const { return LongLongAlign; } /// \brief Determine whether the __int128 type is supported on this target. - bool hasInt128Type() const { return getPointerWidth(0) >= 64; } // FIXME + virtual bool hasInt128Type() const { return getPointerWidth(0) >= 64; } // FIXME /// \brief Return the alignment that is suitable for storing any /// object with a fundamental alignment requirement. Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -5821,6 +5821,8 @@ Aliases = GCCRegAliases; NumAliases = llvm::array_lengthof(GCCRegAliases); } + + bool hasInt128Type() const override { return true; } }; class Mips64EBTargetInfo : public Mips64TargetInfoBase { Index: test/CodeGen/mips-type-sizes-int128.c =================================================================== --- /dev/null +++ test/CodeGen/mips-type-sizes-int128.c @@ -0,0 +1,13 @@ +// RUN: not %clang_cc1 -triple mips-none-linux-gnu -emit-llvm -w -o - %s 2> %t1 +// RUN: FileCheck --check-prefix=O32 %s < %t1 + +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -target-abi n32 -o - %s | FileCheck --check-prefix=NEW %s +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -o - %s | FileCheck --check-prefix=NEW %s + +// O32 does not support __int128 so it must be tested separately +// N32/N64 behave the same way so their tests have been combined into NEW + +int check_int128() { + return sizeof(__int128); // O32: :[[@LINE]]:17: error: __int128 is not supported on this target +// NEW: ret i32 16 +} Index: test/CodeGen/mips-type-sizes.c =================================================================== --- /dev/null +++ test/CodeGen/mips-type-sizes.c @@ -0,0 +1,92 @@ +// RUN: %clang_cc1 -triple mips-none-linux-gnu -emit-llvm -w -o - %s | FileCheck --check-prefix=ALL --check-prefix=O32 %s +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -target-abi n32 -o - %s | FileCheck --check-prefix=ALL --check-prefix=N32 %s +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -o - %s | FileCheck --check-prefix=ALL --check-prefix=N64 %s + +int check_char() { + return sizeof(char); +// ALL: ret i32 1 +} + +int check_short() { + return sizeof(short); +// ALL: ret i32 2 +} + +int check_int() { + return sizeof(int); +// ALL: ret i32 4 +} + +int check_long() { + return sizeof(long); +// O32: ret i32 4 +// N32: ret i32 4 +// N64: ret i32 8 +} + +int check_longlong() { + return sizeof(long long); +// ALL: ret i32 8 +} + +int check_fp16() { + return sizeof(__fp16); +// ALL: ret i32 2 +} + +int check_float() { + return sizeof(float); +// ALL: ret i32 4 +} + +int check_double() { + return sizeof(double); +// ALL: ret i32 8 +} + +int check_longdouble() { + return sizeof(long double); +// O32: ret i32 8 +// N32: ret i32 16 +// N64: ret i32 16 +} + +int check_floatComplex() { + return sizeof(float _Complex); +// ALL: ret i32 8 +} + +int check_doubleComplex() { + return sizeof(double _Complex); +// ALL: ret i32 16 +} + +int check_longdoubleComplex() { + return sizeof(long double _Complex); +// O32: ret i32 16 +// N32: ret i32 32 +// N64: ret i32 32 +} + +int check_bool() { + return sizeof(_Bool); +// ALL: ret i32 1 +} + +int check_wchar() { + return sizeof(__WCHAR_TYPE__); +// ALL: ret i32 4 +} + +int check_wchar_is_unsigned() { + return (__WCHAR_TYPE__)-1 > (__WCHAR_TYPE__)0; +// ALL: ret i32 0 +} + +int check_ptr() { + return sizeof(void *); +// O32: ret i32 4 +// N32: ret i32 4 +// N64: ret i32 8 +} +