forked from OSchip/llvm-project
[CFL-AA] CFL-AA should not assert on an va_arg instruction
The CFL-AA implementation was missing a visit* routine for va_arg instructions, causing it to assert when run on a function that had one. For now, handle these in a conservative way. Fixes PR20954. llvm-svn: 219718
This commit is contained in:
parent
0ca42bb5a8
commit
db5f86a9bf
|
@ -317,6 +317,17 @@ public:
|
|||
Output.push_back(Edge(Ptr, Val, EdgeType::Dereference, AttrNone));
|
||||
}
|
||||
|
||||
void visitVAArgInst(VAArgInst &Inst) {
|
||||
// We can't fully model va_arg here. For *Ptr = Inst.getOperand(0), it does
|
||||
// two things:
|
||||
// 1. Loads a value from *((T*)*Ptr).
|
||||
// 2. Increments (stores to) *Ptr by some target-specific amount.
|
||||
// For now, we'll handle this like a landingpad instruction (by placing the
|
||||
// result in its own group, and having that group alias externals).
|
||||
auto *Val = &Inst;
|
||||
Output.push_back(Edge(Val, Val, EdgeType::Assign, AttrAll));
|
||||
}
|
||||
|
||||
static bool isFunctionExternal(Function *Fn) {
|
||||
return Fn->isDeclaration() || !Fn->hasLocalLinkage();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
; RUN: opt < %s -cfl-aa -aa-eval -print-may-aliases -disable-output 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: Function: test1
|
||||
; CHECK: 0 no alias responses
|
||||
|
||||
define i32 @test1(i32 %X, ...) {
|
||||
; Initialize variable argument processing
|
||||
%ap = alloca i8*
|
||||
%ap2 = bitcast i8** %ap to i8*
|
||||
call void @llvm.va_start(i8* %ap2)
|
||||
|
||||
; Read a single integer argument
|
||||
%tmp = va_arg i8** %ap, i32
|
||||
|
||||
; Demonstrate usage of llvm.va_copy and llvm.va_end
|
||||
%aq = alloca i8*
|
||||
%aq2 = bitcast i8** %aq to i8*
|
||||
call void @llvm.va_copy(i8* %aq2, i8* %ap2)
|
||||
call void @llvm.va_end(i8* %aq2)
|
||||
|
||||
; Stop processing of arguments.
|
||||
call void @llvm.va_end(i8* %ap2)
|
||||
ret i32 %tmp
|
||||
}
|
||||
|
||||
declare void @llvm.va_start(i8*)
|
||||
declare void @llvm.va_copy(i8*, i8*)
|
||||
declare void @llvm.va_end(i8*)
|
||||
|
Loading…
Reference in New Issue