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