1 //===- llvm/unittest/IR/AsmWriter.cpp - AsmWriter tests -------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
8 #include "llvm/BinaryFormat/Dwarf.h"
9 #include "llvm/IR/DebugInfoMetadata.h"
10 #include "llvm/IR/Function.h"
11 #include "llvm/IR/IRBuilder.h"
12 #include "llvm/IR/LLVMContext.h"
13 #include "llvm/IR/MDBuilder.h"
14 #include "llvm/IR/Module.h"
15 #include "gmock/gmock.h"
16 #include "gtest/gtest.h"
19 using ::testing::HasSubstr
;
23 TEST(AsmWriterTest
, DebugPrintDetachedInstruction
) {
25 // PR24852: Ensure that an instruction can be printed even when it
26 // has metadata attached but no parent.
28 auto Ty
= Type::getInt32Ty(Ctx
);
29 auto Poison
= PoisonValue::get(Ty
);
30 std::unique_ptr
<BinaryOperator
> Add(BinaryOperator::CreateAdd(Poison
, Poison
));
32 "", MDNode::get(Ctx
, {ConstantAsMetadata::get(ConstantInt::get(Ty
, 1))}));
34 raw_string_ostream
OS(S
);
37 HasSubstr("<badref> = add i32 poison, poison, !<empty"));
40 TEST(AsmWriterTest
, DebugPrintDetachedArgument
) {
42 auto Ty
= Type::getInt32Ty(Ctx
);
43 auto Arg
= new Argument(Ty
);
46 raw_string_ostream
OS(S
);
48 EXPECT_EQ(S
, "i32 <badref>");
52 TEST(AsmWriterTest
, DumpDIExpression
) {
55 dwarf::DW_OP_constu
, 4,
59 DIExpression
*Expr
= DIExpression::get(Ctx
, Ops
);
61 raw_string_ostream
OS(S
);
63 EXPECT_EQ("!DIExpression(DW_OP_constu, 4, DW_OP_minus, DW_OP_deref)",
67 TEST(AsmWriterTest
, PrintAddrspaceWithNullOperand
) {
69 Module
M("test module", Ctx
);
70 SmallVector
<Type
*, 3> FArgTypes
;
71 FArgTypes
.push_back(Type::getInt64Ty(Ctx
));
72 FunctionType
*FTy
= FunctionType::get(Type::getVoidTy(Ctx
), FArgTypes
, false);
73 Function
*F
= Function::Create(FTy
, Function::ExternalLinkage
, "", &M
);
74 Argument
*Arg0
= F
->getArg(0);
75 Value
*Args
[] = {Arg0
};
76 std::unique_ptr
<CallInst
> Call(CallInst::Create(F
, Args
));
77 // This will make Call's operand null.
78 Call
->dropAllReferences();
81 raw_string_ostream
OS(S
);
83 EXPECT_THAT(OS
.str(), HasSubstr("<cannot get addrspace!>"));
86 TEST(AsmWriterTest
, PrintNullOperandBundle
) {
88 Type
*Int32Ty
= Type::getInt32Ty(C
);
89 FunctionType
*FnTy
= FunctionType::get(Int32Ty
, Int32Ty
, /*isVarArg=*/false);
90 Value
*Callee
= Constant::getNullValue(PointerType::getUnqual(C
));
91 Value
*Args
[] = {ConstantInt::get(Int32Ty
, 42)};
92 std::unique_ptr
<BasicBlock
> NormalDest(BasicBlock::Create(C
));
93 std::unique_ptr
<BasicBlock
> UnwindDest(BasicBlock::Create(C
));
94 OperandBundleDef
Bundle("bundle", UndefValue::get(Int32Ty
));
95 std::unique_ptr
<InvokeInst
> Invoke(
96 InvokeInst::Create(FnTy
, Callee
, NormalDest
.get(), UnwindDest
.get(), Args
,
98 // Makes the operand bundle null.
99 Invoke
->dropAllReferences();
100 Invoke
->setNormalDest(NormalDest
.get());
101 Invoke
->setUnwindDest(UnwindDest
.get());
104 raw_string_ostream
OS(S
);
106 EXPECT_THAT(OS
.str(), HasSubstr("<null operand bundle!>"));