107cda257SDaniel Sanders #include "llvm/Target/TargetOptions.h" 26ac16e91SDaniel Sanders #include "llvm/CodeGen/TargetPassConfig.h" 307cda257SDaniel Sanders #include "llvm/IR/LLVMContext.h" 407cda257SDaniel Sanders #include "llvm/IR/LegacyPassManager.h" 53306fe10SHeejin Ahn #include "llvm/InitializePasses.h" 689b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h" 707cda257SDaniel Sanders #include "llvm/Support/TargetSelect.h" 807cda257SDaniel Sanders #include "llvm/Target/TargetMachine.h" 907cda257SDaniel Sanders #include "gtest/gtest.h" 1007cda257SDaniel Sanders 1107cda257SDaniel Sanders using namespace llvm; 1207cda257SDaniel Sanders 1307cda257SDaniel Sanders namespace llvm { 1407cda257SDaniel Sanders void initializeTestPassPass(PassRegistry &); 1507cda257SDaniel Sanders } 1607cda257SDaniel Sanders 1707cda257SDaniel Sanders namespace { 1807cda257SDaniel Sanders 1907cda257SDaniel Sanders void initLLVM() { 2007cda257SDaniel Sanders InitializeAllTargets(); 2107cda257SDaniel Sanders InitializeAllTargetMCs(); 2207cda257SDaniel Sanders InitializeAllAsmPrinters(); 2307cda257SDaniel Sanders InitializeAllAsmParsers(); 2407cda257SDaniel Sanders 2507cda257SDaniel Sanders PassRegistry *Registry = PassRegistry::getPassRegistry(); 2607cda257SDaniel Sanders initializeCore(*Registry); 2707cda257SDaniel Sanders initializeCodeGen(*Registry); 2807cda257SDaniel Sanders } 2907cda257SDaniel Sanders 3007cda257SDaniel Sanders /// Create a TargetMachine. We need a target that doesn't have IPRA enabled by 3107cda257SDaniel Sanders /// default. That turns out to be all targets at the moment, so just use X86. 3207cda257SDaniel Sanders std::unique_ptr<TargetMachine> createTargetMachine(bool EnableIPRA) { 3307cda257SDaniel Sanders Triple TargetTriple("x86_64--"); 3407cda257SDaniel Sanders std::string Error; 3507cda257SDaniel Sanders const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error); 3607cda257SDaniel Sanders if (!T) 3707cda257SDaniel Sanders return nullptr; 3807cda257SDaniel Sanders 3907cda257SDaniel Sanders TargetOptions Options; 4007cda257SDaniel Sanders Options.EnableIPRA = EnableIPRA; 41b6a01caaSKazu Hirata return std::unique_ptr<TargetMachine>( 42b6a01caaSKazu Hirata T->createTargetMachine("X86", "", "", Options, std::nullopt, std::nullopt, 430a1aa6cdSArthur Eubanks CodeGenOptLevel::Aggressive)); 4407cda257SDaniel Sanders } 4507cda257SDaniel Sanders 4607cda257SDaniel Sanders typedef std::function<void(bool)> TargetOptionsTest; 4707cda257SDaniel Sanders 4807cda257SDaniel Sanders static void targetOptionsTest(bool EnableIPRA) { 4907cda257SDaniel Sanders std::unique_ptr<TargetMachine> TM = createTargetMachine(EnableIPRA); 5007cda257SDaniel Sanders // This test is designed for the X86 backend; stop if it is not available. 5107cda257SDaniel Sanders if (!TM) 525bbf1feaSIgor Kudrin GTEST_SKIP(); 5307cda257SDaniel Sanders legacy::PassManager PM; 5407cda257SDaniel Sanders 55*bb3f5e1fSMatin Raayai TargetPassConfig *TPC = TM->createPassConfig(PM); 5607cda257SDaniel Sanders (void)TPC; 5707cda257SDaniel Sanders 5807cda257SDaniel Sanders ASSERT_TRUE(TM->Options.EnableIPRA == EnableIPRA); 596ac16e91SDaniel Sanders 606ac16e91SDaniel Sanders delete TPC; 6107cda257SDaniel Sanders } 6207cda257SDaniel Sanders 6307cda257SDaniel Sanders } // End of anonymous namespace. 6407cda257SDaniel Sanders 6507cda257SDaniel Sanders TEST(TargetOptionsTest, IPRASetToOff) { 6607cda257SDaniel Sanders targetOptionsTest(false); 6707cda257SDaniel Sanders } 6807cda257SDaniel Sanders 6907cda257SDaniel Sanders TEST(TargetOptionsTest, IPRASetToOn) { 7007cda257SDaniel Sanders targetOptionsTest(true); 7107cda257SDaniel Sanders } 7207cda257SDaniel Sanders 7307cda257SDaniel Sanders int main(int argc, char **argv) { 7407cda257SDaniel Sanders ::testing::InitGoogleTest(&argc, argv); 7507cda257SDaniel Sanders initLLVM(); 7607cda257SDaniel Sanders return RUN_ALL_TESTS(); 7707cda257SDaniel Sanders } 78