forked from OSchip/llvm-project
[MIPS] Re-land the change r238200 to fix extension of integer types
Re-land the change r238200, but with modifications in the tests that should prevent new failures in some environments as reported with the original change on the mailing list. llvm-svn: 238253
This commit is contained in:
parent
38840245e4
commit
1a3f965fe3
|
@ -87,6 +87,8 @@ namespace clang {
|
|||
virtual bool isHomogeneousAggregateSmallEnough(const Type *Base,
|
||||
uint64_t Members) const;
|
||||
|
||||
virtual bool shouldSignExtUnsignedType(QualType Ty) const;
|
||||
|
||||
bool isHomogeneousAggregate(QualType Ty, const Type *&Base,
|
||||
uint64_t &Members) const;
|
||||
|
||||
|
|
|
@ -1588,8 +1588,12 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
|
|||
case ABIArgInfo::Extend:
|
||||
if (ParamType->isSignedIntegerOrEnumerationType())
|
||||
Attrs.addAttribute(llvm::Attribute::SExt);
|
||||
else if (ParamType->isUnsignedIntegerOrEnumerationType())
|
||||
Attrs.addAttribute(llvm::Attribute::ZExt);
|
||||
else if (ParamType->isUnsignedIntegerOrEnumerationType()) {
|
||||
if (getTypes().getABIInfo().shouldSignExtUnsignedType(ParamType))
|
||||
Attrs.addAttribute(llvm::Attribute::SExt);
|
||||
else
|
||||
Attrs.addAttribute(llvm::Attribute::ZExt);
|
||||
}
|
||||
// FALL THROUGH
|
||||
case ABIArgInfo::Direct:
|
||||
if (ArgNo == 0 && FI.isChainCall())
|
||||
|
|
|
@ -108,6 +108,10 @@ bool ABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ABIInfo::shouldSignExtUnsignedType(QualType Ty) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
void ABIArgInfo::dump() const {
|
||||
raw_ostream &OS = llvm::errs();
|
||||
OS << "(ABIArgInfo Kind=";
|
||||
|
@ -5547,6 +5551,7 @@ public:
|
|||
void computeInfo(CGFunctionInfo &FI) const override;
|
||||
llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
|
||||
CodeGenFunction &CGF) const override;
|
||||
bool shouldSignExtUnsignedType(QualType Ty) const override;
|
||||
};
|
||||
|
||||
class MIPSTargetCodeGenInfo : public TargetCodeGenInfo {
|
||||
|
@ -5849,6 +5854,16 @@ llvm::Value* MipsABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
|
|||
return AddrTyped;
|
||||
}
|
||||
|
||||
bool MipsABIInfo::shouldSignExtUnsignedType(QualType Ty) const {
|
||||
int TySize = getContext().getTypeSize(Ty);
|
||||
|
||||
// MIPS64 ABI requires unsigned 32 bit integers to be sign extended.
|
||||
if (Ty->isUnsignedIntegerOrEnumerationType() && TySize == 32)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
MIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
|
||||
llvm::Value *Address) const {
|
||||
|
|
|
@ -76,8 +76,8 @@ void test1(void) {
|
|||
// MIPS32: store atomic i32 {{.*}}, i32* @i1 seq_cst
|
||||
// MIPS32: call i64 @__atomic_load_8(i8* bitcast (i64* @ll1 to i8*)
|
||||
// MIPS32: call void @__atomic_store_8(i8* bitcast (i64* @ll1 to i8*), i64
|
||||
// MIPS32: call void @__atomic_load(i32 zeroext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0)
|
||||
// MIPS32: call void @__atomic_store(i32 zeroext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0)
|
||||
// MIPS32: call void @__atomic_load(i32 signext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0)
|
||||
// MIPS32: call void @__atomic_store(i32 signext 100, i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0)
|
||||
|
||||
// MIPS64-LABEL: define void @test1
|
||||
// MIPS64: = load atomic i8, i8* @c1 seq_cst
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// RUN: %clang_cc1 -triple mips64-unknown-linux -O2 -target-abi n64 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N64
|
||||
// RUN: %clang_cc1 -triple mips64-unknown-linux -O2 -target-abi n32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N32
|
||||
// RUN: %clang_cc1 -triple mips-unknown-linux -O2 -target-abi o32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=O32
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
unsigned foo(int x, ...) {
|
||||
va_list valist;
|
||||
va_start(valist, x);
|
||||
unsigned a;
|
||||
a = va_arg(valist, unsigned);
|
||||
return a;
|
||||
}
|
||||
|
||||
void foo1() {
|
||||
unsigned f = 0xffffffe0;
|
||||
foo(1,f);
|
||||
}
|
||||
|
||||
//N64: call i32 (i32, ...) @foo(i32 signext undef, i32 signext -32)
|
||||
//N32: call i32 (i32, ...) @foo(i32 signext undef, i32 signext -32)
|
||||
//O32: call i32 (i32, ...) @foo(i32 signext undef, i32 signext -32)
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang_cc1 -triple mips64-unknown-linux -O0 -target-abi n64 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N64
|
||||
// RUN: %clang_cc1 -triple mips64-unknown-linux -O0 -target-abi n32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=N32
|
||||
// RUN: %clang_cc1 -triple mips-unknown-linux -O0 -target-abi o32 -S -emit-llvm %s -o - | FileCheck %s -check-prefix=O32
|
||||
|
||||
void foo(unsigned a) {
|
||||
}
|
||||
|
||||
void foo1() {
|
||||
unsigned f = 0xffffffe0;
|
||||
foo(f);
|
||||
}
|
||||
|
||||
// N64: call void @foo(i32 signext %{{[0-9]+}})
|
||||
// N32: call void @foo(i32 signext %{{[0-9]+}})
|
||||
// O32: call void @foo(i32 signext %{{[0-9]+}})
|
|
@ -10,10 +10,10 @@ long *alloc_long() {
|
|||
return rv;
|
||||
}
|
||||
// O32-LABEL: define i32* @_Z10alloc_longv()
|
||||
// O32: call noalias i8* @_Znwj(i32 zeroext 4)
|
||||
// O32: call noalias i8* @_Znwj(i32 signext 4)
|
||||
|
||||
// N32-LABEL: define i32* @_Z10alloc_longv()
|
||||
// N32: call noalias i8* @_Znwj(i32 zeroext 4)
|
||||
// N32: call noalias i8* @_Znwj(i32 signext 4)
|
||||
|
||||
// N64-LABEL: define i64* @_Z10alloc_longv()
|
||||
// N64: call noalias i8* @_Znwm(i64 zeroext 8)
|
||||
|
@ -24,10 +24,10 @@ long *alloc_long_array() {
|
|||
}
|
||||
|
||||
// O32-LABEL: define i32* @_Z16alloc_long_arrayv()
|
||||
// O32: call noalias i8* @_Znaj(i32 zeroext 8)
|
||||
// O32: call noalias i8* @_Znaj(i32 signext 8)
|
||||
|
||||
// N32-LABEL: define i32* @_Z16alloc_long_arrayv()
|
||||
// N32: call noalias i8* @_Znaj(i32 zeroext 8)
|
||||
// N32: call noalias i8* @_Znaj(i32 signext 8)
|
||||
|
||||
// N64-LABEL: define i64* @_Z16alloc_long_arrayv()
|
||||
// N64: call noalias i8* @_Znam(i64 zeroext 16)
|
||||
|
|
Loading…
Reference in New Issue