mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Fix problem with r204836
In CallInst, op_end() points at the callee, which we don't want to iterate over when just iterating over arguments. Now take this into account when returning a iterator_range from arg_operands. Similar reasoning for InvokeInst. Also adds a unit test to verify this actually works as expected. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204851 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6da0178737
commit
1003e8fbfa
@ -1297,12 +1297,14 @@ public:
|
|||||||
|
|
||||||
/// arg_operands - iteration adapter for range-for loops.
|
/// arg_operands - iteration adapter for range-for loops.
|
||||||
iterator_range<op_iterator> arg_operands() {
|
iterator_range<op_iterator> arg_operands() {
|
||||||
return iterator_range<op_iterator>(op_begin(), op_end());
|
// The last operand in the op list is the callee - it's not one of the args
|
||||||
|
// so we don't want to iterate over it.
|
||||||
|
return iterator_range<op_iterator>(op_begin(), op_end() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// arg_operands - iteration adapter for range-for loops.
|
/// arg_operands - iteration adapter for range-for loops.
|
||||||
iterator_range<const_op_iterator> arg_operands() const {
|
iterator_range<const_op_iterator> arg_operands() const {
|
||||||
return iterator_range<const_op_iterator>(op_begin(), op_end());
|
return iterator_range<const_op_iterator>(op_begin(), op_end() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Wrappers for getting the \c Use of a call argument.
|
/// \brief Wrappers for getting the \c Use of a call argument.
|
||||||
@ -2954,12 +2956,12 @@ public:
|
|||||||
|
|
||||||
/// arg_operands - iteration adapter for range-for loops.
|
/// arg_operands - iteration adapter for range-for loops.
|
||||||
iterator_range<op_iterator> arg_operands() {
|
iterator_range<op_iterator> arg_operands() {
|
||||||
return iterator_range<op_iterator>(op_begin(), op_end());
|
return iterator_range<op_iterator>(op_begin(), op_end() - 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// arg_operands - iteration adapter for range-for loops.
|
/// arg_operands - iteration adapter for range-for loops.
|
||||||
iterator_range<const_op_iterator> arg_operands() const {
|
iterator_range<const_op_iterator> arg_operands() const {
|
||||||
return iterator_range<const_op_iterator>(op_begin(), op_end());
|
return iterator_range<const_op_iterator>(op_begin(), op_end() - 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Wrappers for getting the \c Use of a invoke argument.
|
/// \brief Wrappers for getting the \c Use of a invoke argument.
|
||||||
|
@ -14,11 +14,14 @@
|
|||||||
#include "llvm/IR/Constants.h"
|
#include "llvm/IR/Constants.h"
|
||||||
#include "llvm/IR/DataLayout.h"
|
#include "llvm/IR/DataLayout.h"
|
||||||
#include "llvm/IR/DerivedTypes.h"
|
#include "llvm/IR/DerivedTypes.h"
|
||||||
|
#include "llvm/IR/Function.h"
|
||||||
#include "llvm/IR/IRBuilder.h"
|
#include "llvm/IR/IRBuilder.h"
|
||||||
#include "llvm/IR/LLVMContext.h"
|
#include "llvm/IR/LLVMContext.h"
|
||||||
#include "llvm/IR/MDBuilder.h"
|
#include "llvm/IR/MDBuilder.h"
|
||||||
|
#include "llvm/IR/Module.h"
|
||||||
#include "llvm/IR/Operator.h"
|
#include "llvm/IR/Operator.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
namespace {
|
namespace {
|
||||||
@ -47,6 +50,29 @@ TEST(InstructionsTest, ReturnInst) {
|
|||||||
delete r1;
|
delete r1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(InstructionsTest, CallInst) {
|
||||||
|
LLVMContext &C(getGlobalContext());
|
||||||
|
std::unique_ptr<Module> M(new Module("MyModule", C));
|
||||||
|
|
||||||
|
Type *ArgTypes[] = {Type::getInt8Ty(C), Type::getInt32Ty(C),
|
||||||
|
Type::getInt64Ty(C)};
|
||||||
|
FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), ArgTypes, false);
|
||||||
|
Function *F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
|
||||||
|
|
||||||
|
Value *Args[] = {ConstantInt::get(Type::getInt8Ty(C), 20),
|
||||||
|
ConstantInt::get(Type::getInt32Ty(C), 9999),
|
||||||
|
ConstantInt::get(Type::getInt64Ty(C), 42)};
|
||||||
|
CallInst *Call = CallInst::Create(F, Args);
|
||||||
|
|
||||||
|
// Make sure iteration over a call's arguments works as expected.
|
||||||
|
unsigned Idx = 0;
|
||||||
|
for (Value *Arg : Call->arg_operands()) {
|
||||||
|
EXPECT_EQ(ArgTypes[Idx], Arg->getType());
|
||||||
|
EXPECT_EQ(Call->getArgOperand(Idx)->getType(), Arg->getType());
|
||||||
|
Idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST(InstructionsTest, BranchInst) {
|
TEST(InstructionsTest, BranchInst) {
|
||||||
LLVMContext &C(getGlobalContext());
|
LLVMContext &C(getGlobalContext());
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user