mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-08 12:08:46 +00:00
6a02f0bf77
This patch fixes some ASAN unittest failures on FreeBSD. See the cfe-commits email thread for r290169 for more on those. According to the LangRef, the allocsize attribute only tells us about the number of bytes that exist at the memory location pointed to by the return value of a function. It does not necessarily mean that the function will only ever allocate. So, we need to be very careful about treating functions with allocsize as general allocation functions. This patch makes us fully conservative in this regard, though I suspect that we have room to be a bit more aggressive if we want. This has a FIXME that can be fixed by a relatively straightforward refactor; I just wanted to keep this patch minimal. If this sticks, I'll come back and fix it in a few days. llvm-svn: 290397
51 lines
1.8 KiB
C++
51 lines
1.8 KiB
C++
//===- MemoryBuiltinsTest.cpp - Tests for utilities in MemoryBuiltins.h ---===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Analysis/MemoryBuiltins.h"
|
|
#include "llvm/IR/Attributes.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
// allocsize should not imply that a function is a traditional allocation
|
|
// function (e.g. that can be optimized out/...); it just tells us how many
|
|
// bytes exist at the pointer handed back by the function.
|
|
TEST(AllocSize, AllocationBuiltinsTest) {
|
|
LLVMContext Context;
|
|
Module M("", Context);
|
|
IntegerType *ArgTy = Type::getInt32Ty(Context);
|
|
|
|
Function *AllocSizeFn = Function::Create(
|
|
FunctionType::get(Type::getInt8PtrTy(Context), {ArgTy}, false),
|
|
GlobalValue::ExternalLinkage, "F", &M);
|
|
|
|
AllocSizeFn->addFnAttr(Attribute::getWithAllocSizeArgs(Context, 1, None));
|
|
|
|
// 100 is arbitrary.
|
|
std::unique_ptr<CallInst> Caller(
|
|
CallInst::Create(AllocSizeFn, {ConstantInt::get(ArgTy, 100)}));
|
|
|
|
const TargetLibraryInfo *TLI = nullptr;
|
|
EXPECT_FALSE(isNoAliasFn(Caller.get(), TLI));
|
|
EXPECT_FALSE(isMallocLikeFn(Caller.get(), TLI));
|
|
EXPECT_FALSE(isCallocLikeFn(Caller.get(), TLI));
|
|
EXPECT_FALSE(isAllocLikeFn(Caller.get(), TLI));
|
|
|
|
// FIXME: We might be able to treat allocsize functions as general allocation
|
|
// functions. For the moment, being conservative seems better (and we'd have
|
|
// to plumb stuff around `isNoAliasFn`).
|
|
EXPECT_FALSE(isAllocationFn(Caller.get(), TLI));
|
|
}
|
|
}
|