forked from OSchip/llvm-project
[MSan] [MIPS64] Fix vararg helper for >1 fixed argument.
This fixes http://llvm.org/PR27646 on Mips64. Differential Revision: http://reviews.llvm.org/D19989 llvm-svn: 268673
This commit is contained in:
parent
6689abe632
commit
60061c21cb
|
@ -3032,7 +3032,8 @@ struct VarArgMIPS64Helper : public VarArgHelper {
|
||||||
void visitCallSite(CallSite &CS, IRBuilder<> &IRB) override {
|
void visitCallSite(CallSite &CS, IRBuilder<> &IRB) override {
|
||||||
unsigned VAArgOffset = 0;
|
unsigned VAArgOffset = 0;
|
||||||
const DataLayout &DL = F.getParent()->getDataLayout();
|
const DataLayout &DL = F.getParent()->getDataLayout();
|
||||||
for (CallSite::arg_iterator ArgIt = CS.arg_begin() + 1, End = CS.arg_end();
|
for (CallSite::arg_iterator ArgIt = CS.arg_begin() +
|
||||||
|
CS.getFunctionType()->getNumParams(), End = CS.arg_end();
|
||||||
ArgIt != End; ++ArgIt) {
|
ArgIt != End; ++ArgIt) {
|
||||||
llvm::Triple TargetTriple(F.getParent()->getTargetTriple());
|
llvm::Triple TargetTriple(F.getParent()->getTargetTriple());
|
||||||
Value *A = *ArgIt;
|
Value *A = *ArgIt;
|
||||||
|
|
|
@ -41,3 +41,15 @@ define i32 @bar() {
|
||||||
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 8) to i64*), align 8
|
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 8) to i64*), align 8
|
||||||
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 16) to i64*), align 8
|
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 16) to i64*), align 8
|
||||||
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
|
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
|
||||||
|
|
||||||
|
; Check multiple fixed arguments.
|
||||||
|
declare i32 @foo2(i32 %g1, i32 %g2, ...)
|
||||||
|
define i32 @bar2() {
|
||||||
|
%1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)
|
||||||
|
ret i32 %1
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK-LABEL: @bar2
|
||||||
|
; CHECK: store i64 0, i64* getelementptr inbounds ([100 x i64], [100 x i64]* @__msan_va_arg_tls, i32 0, i32 0), align 8
|
||||||
|
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 8) to i64*), align 8
|
||||||
|
; CHECK: store {{.*}} 16, {{.*}} @__msan_va_arg_overflow_size_tls
|
||||||
|
|
|
@ -40,3 +40,15 @@ define i32 @bar() {
|
||||||
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 8) to i64*), align 8
|
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 8) to i64*), align 8
|
||||||
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 16) to i64*), align 8
|
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 16) to i64*), align 8
|
||||||
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
|
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
|
||||||
|
|
||||||
|
; Check multiple fixed arguments.
|
||||||
|
declare i32 @foo2(i32 %g1, i32 %g2, ...)
|
||||||
|
define i32 @bar2() {
|
||||||
|
%1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)
|
||||||
|
ret i32 %1
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK-LABEL: @bar2
|
||||||
|
; CHECK: store i64 0, i64* getelementptr inbounds ([100 x i64], [100 x i64]* @__msan_va_arg_tls, i32 0, i32 0), align 8
|
||||||
|
; CHECK: store i64 0, i64* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__msan_va_arg_tls to i64), i64 8) to i64*), align 8
|
||||||
|
; CHECK: store {{.*}} 16, {{.*}} @__msan_va_arg_overflow_size_tls
|
||||||
|
|
Loading…
Reference in New Issue