mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-18 08:18:51 +00:00
[Orc] Make the makeStub function propagate argument attributes onto the call to
the function body. This is necessary for correctness when lazily compiling. Also, flesh out the Orc unit test infrastructure slightly, and add a unit test for this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235347 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
48
unittests/ExecutionEngine/Orc/IndirectionUtilsTest.cpp
Normal file
48
unittests/ExecutionEngine/Orc/IndirectionUtilsTest.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
//===- 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 "OrcTestCommon.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(IndirectionUtilsTest, MakeStub) {
|
||||
ModuleBuilder MB(getGlobalContext(), "x86_64-apple-macosx10.10", "");
|
||||
Function *F = MB.createFunctionDecl<void(DummyStruct, DummyStruct)>(MB.getModule(), "");
|
||||
SmallVector<AttributeSet, 4> Attrs;
|
||||
Attrs.push_back(
|
||||
AttributeSet::get(MB.getModule()->getContext(), 1U,
|
||||
AttrBuilder().addAttribute(Attribute::StructRet)));
|
||||
Attrs.push_back(
|
||||
AttributeSet::get(MB.getModule()->getContext(), 2U,
|
||||
AttrBuilder().addAttribute(Attribute::ByVal)));
|
||||
Attrs.push_back(
|
||||
AttributeSet::get(MB.getModule()->getContext(), ~0U,
|
||||
AttrBuilder().addAttribute(Attribute::NoUnwind)));
|
||||
F->setAttributes(AttributeSet::get(MB.getModule()->getContext(), Attrs));
|
||||
|
||||
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(2U, Attribute::ByVal))
|
||||
<< "makeStub should propagate byval attr on 2nd argument.";
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user