mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +00:00
[FuzzMutate] Avoid using swifterror as a source operand
Differential Revision: https://reviews.llvm.org/D41107 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@322280 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1694ebbaaf
commit
e35ff4e49b
@ -20,6 +20,7 @@
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include <functional>
|
||||
@ -128,7 +129,7 @@ static inline SourcePred anyFloatType() {
|
||||
|
||||
static inline SourcePred anyPtrType() {
|
||||
auto Pred = [](ArrayRef<Value *>, const Value *V) {
|
||||
return V->getType()->isPointerTy();
|
||||
return V->getType()->isPointerTy() && !V->isSwiftError();
|
||||
};
|
||||
auto Make = [](ArrayRef<Value *>, ArrayRef<Type *> Ts) {
|
||||
std::vector<Constant *> Result;
|
||||
@ -142,6 +143,9 @@ static inline SourcePred anyPtrType() {
|
||||
|
||||
static inline SourcePred sizedPtrType() {
|
||||
auto Pred = [](ArrayRef<Value *>, const Value *V) {
|
||||
if (V->isSwiftError())
|
||||
return false;
|
||||
|
||||
if (const auto *PtrT = dyn_cast<PointerType>(V->getType()))
|
||||
return PtrT->getElementType()->isSized();
|
||||
return false;
|
||||
|
@ -266,4 +266,34 @@ TEST(RandomIRBuilderTest, FirstClassTypes) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(RandomIRBuilderTest, SwiftError) {
|
||||
// Check that we never pick swifterror value as a source for operation
|
||||
// other than load, store and call.
|
||||
|
||||
LLVMContext Ctx;
|
||||
const char *SourceCode = "declare void @use(i8** swifterror %err)"
|
||||
"define void @test() {\n"
|
||||
"entry:\n"
|
||||
" %err = alloca swifterror i8*, align 8\n"
|
||||
" call void @use(i8** swifterror %err)\n"
|
||||
" ret void\n"
|
||||
"}";
|
||||
auto M = parseAssembly(SourceCode, Ctx);
|
||||
|
||||
std::vector<Type *> Types = {Type::getInt8Ty(Ctx)};
|
||||
RandomIRBuilder IB(Seed, Types);
|
||||
|
||||
// Get first basic block of the test function
|
||||
Function &F = *M->getFunction("test");
|
||||
BasicBlock &BB = *F.begin();
|
||||
Instruction *Alloca = &*BB.begin();
|
||||
|
||||
fuzzerop::OpDescriptor Descr = fuzzerop::gepDescriptor(1);
|
||||
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
Value *V = IB.findOrCreateSource(BB, {Alloca}, {}, Descr.SourcePreds[0]);
|
||||
ASSERT_FALSE(isa<AllocaInst>(V));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user