xref: /llvm-project/llvm/unittests/Transforms/Utils/ModuleUtilsTest.cpp (revision 4e6013250d319a7ca4fc7fb5ba9ac7b1b28d2b4f)
1 //===- ModuleUtilsTest.cpp - Unit tests for Module utility ----===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/Transforms/Utils/ModuleUtils.h"
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/AsmParser/Parser.h"
12 #include "llvm/IR/LLVMContext.h"
13 #include "llvm/IR/Module.h"
14 #include "llvm/Support/SourceMgr.h"
15 #include "gtest/gtest.h"
16 
17 using namespace llvm;
18 
19 static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
20   SMDiagnostic Err;
21   std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
22   if (!Mod)
23     Err.print("ModuleUtilsTest", errs());
24   return Mod;
25 }
26 
27 static int getUsedListSize(Module &M, StringRef Name) {
28   auto *UsedList = M.getGlobalVariable(Name);
29   if (!UsedList)
30     return 0;
31   auto *UsedListBaseArrayType = cast<ArrayType>(UsedList->getValueType());
32   return UsedListBaseArrayType->getNumElements();
33 }
34 
35 TEST(ModuleUtils, AppendToUsedList1) {
36   LLVMContext C;
37 
38   std::unique_ptr<Module> M = parseIR(
39       C, R"(@x = addrspace(4) global [2 x i32] zeroinitializer, align 4)");
40   SmallVector<GlobalValue *, 2> Globals;
41   for (auto &G : M->globals()) {
42     Globals.push_back(&G);
43   }
44   EXPECT_EQ(0, getUsedListSize(*M, "llvm.compiler.used"));
45   appendToCompilerUsed(*M, Globals);
46   EXPECT_EQ(1, getUsedListSize(*M, "llvm.compiler.used"));
47 
48   EXPECT_EQ(0, getUsedListSize(*M, "llvm.used"));
49   appendToUsed(*M, Globals);
50   EXPECT_EQ(1, getUsedListSize(*M, "llvm.used"));
51 }
52 
53 TEST(ModuleUtils, AppendToUsedList2) {
54   LLVMContext C;
55 
56   std::unique_ptr<Module> M =
57       parseIR(C, R"(@x = global [2 x i32] zeroinitializer, align 4)");
58   SmallVector<GlobalValue *, 2> Globals;
59   for (auto &G : M->globals()) {
60     Globals.push_back(&G);
61   }
62   EXPECT_EQ(0, getUsedListSize(*M, "llvm.compiler.used"));
63   appendToCompilerUsed(*M, Globals);
64   EXPECT_EQ(1, getUsedListSize(*M, "llvm.compiler.used"));
65 
66   EXPECT_EQ(0, getUsedListSize(*M, "llvm.used"));
67   appendToUsed(*M, Globals);
68   EXPECT_EQ(1, getUsedListSize(*M, "llvm.used"));
69 }
70