1 #include "llvm/Target/TargetOptions.h"
2 #include "llvm/CodeGen/TargetPassConfig.h"
3 #include "llvm/IR/LLVMContext.h"
4 #include "llvm/IR/LegacyPassManager.h"
5 #include "llvm/InitializePasses.h"
6 #include "llvm/Support/TargetRegistry.h"
7 #include "llvm/Support/TargetSelect.h"
8 #include "llvm/Target/TargetMachine.h"
9 #include "gtest/gtest.h"
10
11 using namespace llvm;
12
13 namespace llvm {
14 void initializeTestPassPass(PassRegistry &);
15 }
16
17 namespace {
18
initLLVM()19 void initLLVM() {
20 InitializeAllTargets();
21 InitializeAllTargetMCs();
22 InitializeAllAsmPrinters();
23 InitializeAllAsmParsers();
24
25 PassRegistry *Registry = PassRegistry::getPassRegistry();
26 initializeCore(*Registry);
27 initializeCodeGen(*Registry);
28 }
29
30 /// Create a TargetMachine. We need a target that doesn't have IPRA enabled by
31 /// default. That turns out to be all targets at the moment, so just use X86.
createTargetMachine(bool EnableIPRA)32 std::unique_ptr<TargetMachine> createTargetMachine(bool EnableIPRA) {
33 Triple TargetTriple("x86_64--");
34 std::string Error;
35 const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
36 if (!T)
37 return nullptr;
38
39 TargetOptions Options;
40 Options.EnableIPRA = EnableIPRA;
41 return std::unique_ptr<TargetMachine>(T->createTargetMachine(
42 "X86", "", "", Options, None, None, CodeGenOpt::Aggressive));
43 }
44
45 typedef std::function<void(bool)> TargetOptionsTest;
46
targetOptionsTest(bool EnableIPRA)47 static void targetOptionsTest(bool EnableIPRA) {
48 std::unique_ptr<TargetMachine> TM = createTargetMachine(EnableIPRA);
49 // This test is designed for the X86 backend; stop if it is not available.
50 if (!TM)
51 return;
52 legacy::PassManager PM;
53 LLVMTargetMachine *LLVMTM = static_cast<LLVMTargetMachine *>(TM.get());
54
55 TargetPassConfig *TPC = LLVMTM->createPassConfig(PM);
56 (void)TPC;
57
58 ASSERT_TRUE(TM->Options.EnableIPRA == EnableIPRA);
59
60 delete TPC;
61 }
62
63 } // End of anonymous namespace.
64
TEST(TargetOptionsTest,IPRASetToOff)65 TEST(TargetOptionsTest, IPRASetToOff) {
66 targetOptionsTest(false);
67 }
68
TEST(TargetOptionsTest,IPRASetToOn)69 TEST(TargetOptionsTest, IPRASetToOn) {
70 targetOptionsTest(true);
71 }
72
main(int argc,char ** argv)73 int main(int argc, char **argv) {
74 ::testing::InitGoogleTest(&argc, argv);
75 initLLVM();
76 return RUN_ALL_TESTS();
77 }
78