mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 20:15:49 -04:00

This shortcut mechanism for creating types was added 10 years ago, but has seen almost no uptake since then, neither internally nor in external projects. The very small number of characters saved by using it does not seem worth the mental overhead of an additional type-creation API, so, delete it. Differential Revision: https://reviews.llvm.org/D56573 llvm-svn: 351020
51 lines
1.9 KiB
C++
51 lines
1.9 KiB
C++
//===- LazyEmittingLayerTest.cpp - Unit tests for the lazy emitting layer -===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
|
|
#include "OrcTestCommon.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
TEST(IndirectionUtilsTest, MakeStub) {
|
|
LLVMContext Context;
|
|
ModuleBuilder MB(Context, "x86_64-apple-macosx10.10", "");
|
|
FunctionType *FTy = FunctionType::get(
|
|
Type::getVoidTy(Context),
|
|
{getDummyStructTy(Context), getDummyStructTy(Context)}, false);
|
|
Function *F = MB.createFunctionDecl(FTy, "");
|
|
AttributeSet FnAttrs = AttributeSet::get(
|
|
Context, AttrBuilder().addAttribute(Attribute::NoUnwind));
|
|
AttributeSet RetAttrs; // None
|
|
AttributeSet ArgAttrs[2] = {
|
|
AttributeSet::get(Context,
|
|
AttrBuilder().addAttribute(Attribute::StructRet)),
|
|
AttributeSet::get(Context, AttrBuilder().addAttribute(Attribute::ByVal)),
|
|
};
|
|
F->setAttributes(AttributeList::get(Context, FnAttrs, RetAttrs, ArgAttrs));
|
|
|
|
auto ImplPtr = orc::createImplPointer(*F->getType(), *MB.getModule(), "", nullptr);
|
|
orc::makeStub(*F, *ImplPtr);
|
|
|
|
auto II = F->getEntryBlock().begin();
|
|
EXPECT_TRUE(isa<LoadInst>(*II)) << "First instruction of stub should be a load.";
|
|
auto *Call = dyn_cast<CallInst>(std::next(II));
|
|
EXPECT_TRUE(Call != nullptr) << "Second instruction of stub should be a call.";
|
|
EXPECT_TRUE(Call->isTailCall()) << "Indirect call from stub should be tail call.";
|
|
EXPECT_TRUE(Call->hasStructRetAttr())
|
|
<< "makeStub should propagate sret attr on 1st argument.";
|
|
EXPECT_TRUE(Call->paramHasAttr(1U, Attribute::ByVal))
|
|
<< "makeStub should propagate byval attr on 2nd argument.";
|
|
}
|
|
|
|
}
|