#include "llvm/Target/TargetOptions.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/InitializePasses.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Target/TargetMachine.h" #include "gtest/gtest.h" using namespace llvm; namespace llvm { void initializeTestPassPass(PassRegistry &); } namespace { void initLLVM() { InitializeAllTargets(); InitializeAllTargetMCs(); InitializeAllAsmPrinters(); InitializeAllAsmParsers(); PassRegistry *Registry = PassRegistry::getPassRegistry(); initializeCore(*Registry); initializeCodeGen(*Registry); } /// Create a TargetMachine. We need a target that doesn't have IPRA enabled by /// default. That turns out to be all targets at the moment, so just use X86. std::unique_ptr createTargetMachine(bool EnableIPRA) { Triple TargetTriple("x86_64--"); std::string Error; const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error); if (!T) return nullptr; TargetOptions Options; Options.EnableIPRA = EnableIPRA; return std::unique_ptr(T->createTargetMachine( "X86", "", "", Options, None, None, CodeGenOpt::Aggressive)); } typedef std::function TargetOptionsTest; static void targetOptionsTest(bool EnableIPRA) { std::unique_ptr TM = createTargetMachine(EnableIPRA); // This test is designed for the X86 backend; stop if it is not available. if (!TM) return; legacy::PassManager PM; LLVMTargetMachine *LLVMTM = static_cast(TM.get()); TargetPassConfig *TPC = LLVMTM->createPassConfig(PM); (void)TPC; ASSERT_TRUE(TM->Options.EnableIPRA == EnableIPRA); delete TPC; } } // End of anonymous namespace. TEST(TargetOptionsTest, IPRASetToOff) { targetOptionsTest(false); } TEST(TargetOptionsTest, IPRASetToOn) { targetOptionsTest(true); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); initLLVM(); return RUN_ALL_TESTS(); }