189b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
2bed7626fSstevewan #include "llvm/Support/TargetSelect.h"
3bed7626fSstevewan #include "llvm/Target/TargetMachine.h"
462c7f035SArchibald Elliott #include "llvm/TargetParser/Triple.h"
5bed7626fSstevewan #include "gtest/gtest.h"
6bed7626fSstevewan
7bed7626fSstevewan using namespace llvm;
8bed7626fSstevewan
9bed7626fSstevewan namespace {
10bed7626fSstevewan
11bed7626fSstevewan class AIXRelocModelTest : public ::testing::Test {
12bed7626fSstevewan protected:
SetUpTestCase()13bed7626fSstevewan static void SetUpTestCase() {
14bed7626fSstevewan LLVMInitializePowerPCTargetInfo();
15bed7626fSstevewan LLVMInitializePowerPCTarget();
16bed7626fSstevewan LLVMInitializePowerPCTargetMC();
17bed7626fSstevewan }
18bed7626fSstevewan };
19bed7626fSstevewan
TEST_F(AIXRelocModelTest,DefalutToPIC)20bed7626fSstevewan TEST_F(AIXRelocModelTest, DefalutToPIC) {
21bed7626fSstevewan Triple TheTriple(/*ArchStr*/ "powerpc", /*VendorStr*/ "", /*OSStr*/ "aix");
22bed7626fSstevewan std::string Error;
23bed7626fSstevewan const Target *TheTarget = TargetRegistry::lookupTarget("", TheTriple, Error);
24bed7626fSstevewan ASSERT_TRUE(TheTarget) << Error;
25bed7626fSstevewan
26bed7626fSstevewan TargetOptions Options;
27bed7626fSstevewan // Create a TargetMachine for powerpc--aix target, and deliberately leave its
28bed7626fSstevewan // relocation model unset.
29bed7626fSstevewan std::unique_ptr<TargetMachine> Target(TheTarget->createTargetMachine(
30bed7626fSstevewan /*TT*/ TheTriple.getTriple(), /*CPU*/ "", /*Features*/ "",
31b6a01caaSKazu Hirata /*Options*/ Options, /*RM*/ std::nullopt, /*CM*/ std::nullopt,
32*0a1aa6cdSArthur Eubanks /*OL*/ CodeGenOptLevel::Default));
33bed7626fSstevewan ASSERT_TRUE(Target) << "Could not allocate target machine!";
34bed7626fSstevewan
35bed7626fSstevewan // The relocation model on AIX should be forced to PIC regardless.
36bed7626fSstevewan EXPECT_TRUE(Target->getRelocationModel() == Reloc::PIC_);
37bed7626fSstevewan }
38bed7626fSstevewan
39bed7626fSstevewan } // end of anonymous namespace
40