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"
6*89b57061SReid 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
initLLVM()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.
createTargetMachine(bool EnableIPRA)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;
4107cda257SDaniel Sanders return std::unique_ptr<TargetMachine>(T->createTargetMachine(
4207cda257SDaniel Sanders "X86", "", "", Options, None, None, CodeGenOpt::Aggressive));
4307cda257SDaniel Sanders }
4407cda257SDaniel Sanders
4507cda257SDaniel Sanders typedef std::function<void(bool)> TargetOptionsTest;
4607cda257SDaniel Sanders
targetOptionsTest(bool EnableIPRA)4707cda257SDaniel Sanders static void targetOptionsTest(bool EnableIPRA) {
4807cda257SDaniel Sanders std::unique_ptr<TargetMachine> TM = createTargetMachine(EnableIPRA);
4907cda257SDaniel Sanders // This test is designed for the X86 backend; stop if it is not available.
5007cda257SDaniel Sanders if (!TM)
515bbf1feaSIgor Kudrin GTEST_SKIP();
5207cda257SDaniel Sanders legacy::PassManager PM;
53f250cf8bSDaniel Sanders LLVMTargetMachine *LLVMTM = static_cast<LLVMTargetMachine *>(TM.get());
5407cda257SDaniel Sanders
556ac16e91SDaniel Sanders TargetPassConfig *TPC = LLVMTM->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
TEST(TargetOptionsTest,IPRASetToOff)6507cda257SDaniel Sanders TEST(TargetOptionsTest, IPRASetToOff) {
6607cda257SDaniel Sanders targetOptionsTest(false);
6707cda257SDaniel Sanders }
6807cda257SDaniel Sanders
TEST(TargetOptionsTest,IPRASetToOn)6907cda257SDaniel Sanders TEST(TargetOptionsTest, IPRASetToOn) {
7007cda257SDaniel Sanders targetOptionsTest(true);
7107cda257SDaniel Sanders }
7207cda257SDaniel Sanders
main(int argc,char ** argv)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