8ad310d8创建于 2023年11月10日历史提交
/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "driver_options.h"
#include "triple.h"
#include "gtest/gtest.h"

using namespace maple;

/* Check Triple initialization with target string */
TEST(utTriple, triple1)
{
    Triple::GetTriple().Init("aarch64");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), false);

    Triple::GetTriple().Init("aarch64_le");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), false);

    Triple::GetTriple().Init("aarch64_be");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64_be);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), true);

    Triple::GetTriple().Init("aarch64_be-ilp32");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNUILP32);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64_be);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), true);

    Triple::GetTriple().Init("aarch64_be-gnuilp32");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNUILP32);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64_be);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), true);

    Triple::GetTriple().Init("aarch64_be-linux-gnuilp32");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNUILP32);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64_be);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), true);

    Triple::GetTriple().Init();
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), false);

    /* Incorrect value leads to default initialization */
    Triple::GetTriple().Init("incorect-triple");
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), false);
}

/* Check Triple initialization with options */
TEST(utTriple, triple2)
{
    const char *argv[] = {"maple",  // program name
                          "-be", "--ilp32", nullptr};
    int argc = (sizeof(argv) / sizeof(argv[0])) - 1;

    cl::CommandLine::GetCommandLine().Clear();
    auto err = cl::CommandLine::GetCommandLine().Parse(argc, (char **)argv);
    ASSERT_EQ(err, cl::RetCode::noError);

    /* Triple checks -be and --ilp32 options inside to set the target */
    Triple::GetTriple().Init();
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNUILP32);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64_be);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), true);

    const char *argv2[] = {"maple",  // program name
                           nullptr};
    argc = (sizeof(argv) / sizeof(argv[0])) - 1;

    cl::CommandLine::GetCommandLine().Clear();
    err = cl::CommandLine::GetCommandLine().Parse(argc, (char **)argv2);
    ASSERT_EQ(err, cl::RetCode::noError);

    Triple::GetTriple().Init();
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), false);

    // create command line
    const char *argv3[] = {"maple",  // program name
                           "--target=aarch64_be-gnuilp32", nullptr};
    argc = (sizeof(argv) / sizeof(argv[0])) - 1;

    cl::CommandLine::GetCommandLine().Clear();
    err = cl::CommandLine::GetCommandLine().Parse(argc, (char **)argv3);
    ASSERT_EQ(err, cl::RetCode::noError);

    Triple::GetTriple().Init(opts::target);
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNUILP32);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64_be);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), true);
}

/* Check the priority of Triple initialization: -be/--ilp32 vs --target */
TEST(utTriple, triple3)
{
    // create command line
    const char *argv[] = {"maple",  // program name
                          "-be", "--ilp32", "--target=aarch64-gnu", nullptr};
    int argc = (sizeof(argv) / sizeof(argv[0])) - 1;

    cl::CommandLine::GetCommandLine().Clear();
    auto err = cl::CommandLine::GetCommandLine().Parse(argc, (char **)argv);
    ASSERT_EQ(err, cl::RetCode::noError);

    /* --target option has hicher priority than --ilp32/-be options */
    Triple::GetTriple().Init(opts::target);
    ASSERT_EQ(Triple::GetTriple().GetEnvironment(), Triple::EnvironmentType::GNU);
    ASSERT_EQ(Triple::GetTriple().GetArch(), Triple::ArchType::aarch64);
    ASSERT_EQ(Triple::GetTriple().IsBigEndian(), false);
}