brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.4 KiB · 3bf1c3f Raw
496 lines · cpp
1//===-- ArchSpecTest.cpp --------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "gtest/gtest.h"10 11#include "lldb/Utility/ArchSpec.h"12#include "llvm/BinaryFormat/ELF.h"13#include "llvm/BinaryFormat/MachO.h"14 15using namespace lldb;16using namespace lldb_private;17 18TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleSimple) {19 20  // Success conditions.  Valid cpu/subtype combinations using both - and .21  ArchSpec AS;22  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10", AS));23  EXPECT_EQ(12u, AS.GetMachOCPUType());24  EXPECT_EQ(10u, AS.GetMachOCPUSubType());25 26  AS = ArchSpec();27  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15", AS));28  EXPECT_EQ(12u, AS.GetMachOCPUType());29  EXPECT_EQ(15u, AS.GetMachOCPUSubType());30 31  AS = ArchSpec();32  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12.15", AS));33  EXPECT_EQ(12u, AS.GetMachOCPUType());34  EXPECT_EQ(15u, AS.GetMachOCPUSubType());35 36  // Failure conditions.37 38  // Valid string, unknown cpu/subtype.39  AS = ArchSpec();40  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("13.11", AS));41  EXPECT_EQ(0u, AS.GetMachOCPUType());42  EXPECT_EQ(0u, AS.GetMachOCPUSubType());43 44  // Missing / invalid cpu or subtype45  AS = ArchSpec();46  EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13", AS));47 48  AS = ArchSpec();49  EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("13.A", AS));50 51  AS = ArchSpec();52  EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("A.13", AS));53 54  // Empty string.55  AS = ArchSpec();56  EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("", AS));57}58 59TEST(ArchSpecTest, TestParseMachCPUDashSubtypeTripleExtra) {60  ArchSpec AS;61  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor-os", AS));62  EXPECT_EQ(12u, AS.GetMachOCPUType());63  EXPECT_EQ(15u, AS.GetMachOCPUSubType());64  EXPECT_EQ("vendor", AS.GetTriple().getVendorName());65  EXPECT_EQ("os", AS.GetTriple().getOSName());66 67  AS = ArchSpec();68  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor-os-name", AS));69  EXPECT_EQ(12u, AS.GetMachOCPUType());70  EXPECT_EQ(10u, AS.GetMachOCPUSubType());71  EXPECT_EQ("vendor", AS.GetTriple().getVendorName());72  EXPECT_EQ("os", AS.GetTriple().getOSName());73 74  AS = ArchSpec();75  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-15-vendor.os-name", AS));76  EXPECT_EQ(12u, AS.GetMachOCPUType());77  EXPECT_EQ(15u, AS.GetMachOCPUSubType());78  EXPECT_EQ("vendor.os", AS.GetTriple().getVendorName());79  EXPECT_EQ("name", AS.GetTriple().getOSName());80 81  // These there should parse correctly, but the vendor / OS should be defaulted82  // since they are unrecognized.83  AS = ArchSpec();84  EXPECT_TRUE(ParseMachCPUDashSubtypeTriple("12-10-vendor", AS));85  EXPECT_EQ(12u, AS.GetMachOCPUType());86  EXPECT_EQ(10u, AS.GetMachOCPUSubType());87  EXPECT_EQ("apple", AS.GetTriple().getVendorName());88  EXPECT_EQ("", AS.GetTriple().getOSName());89 90  AS = ArchSpec();91  EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12.10.10", AS));92 93  AS = ArchSpec();94  EXPECT_FALSE(ParseMachCPUDashSubtypeTriple("12-10.10", AS));95}96 97TEST(ArchSpecTest, TestSetTriple) {98  ArchSpec AS;99 100  // Various flavors of valid triples.101  EXPECT_TRUE(AS.SetTriple("12-10-apple-darwin"));102  EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_ARM), AS.GetMachOCPUType());103  EXPECT_EQ(10u, AS.GetMachOCPUSubType());104  EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())105                  .consume_front("armv7f-apple-darwin"));106  EXPECT_EQ(ArchSpec::eCore_arm_armv7f, AS.GetCore());107 108  AS = ArchSpec();109  EXPECT_TRUE(AS.SetTriple("18.100-apple-darwin"));110  EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_POWERPC), AS.GetMachOCPUType());111  EXPECT_EQ(100u, AS.GetMachOCPUSubType());112  EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())113                  .consume_front("powerpc-apple-darwin"));114  EXPECT_EQ(ArchSpec::eCore_ppc_ppc970, AS.GetCore());115 116  AS = ArchSpec();117  EXPECT_TRUE(AS.SetTriple("24-0-apple-unknown"));118  EXPECT_EQ(uint32_t(llvm::MachO::CPU_TYPE_RISCV), AS.GetMachOCPUType());119  EXPECT_EQ(0u, AS.GetMachOCPUSubType());120  EXPECT_TRUE(llvm::StringRef(AS.GetTriple().str())121                  .consume_front("riscv32-apple-unknown"));122  EXPECT_EQ(ArchSpec::eCore_riscv32, AS.GetCore());123 124  AS = ArchSpec();125  EXPECT_TRUE(AS.SetTriple("i686-pc-windows"));126  EXPECT_EQ(llvm::Triple::x86, AS.GetTriple().getArch());127  EXPECT_EQ(llvm::Triple::PC, AS.GetTriple().getVendor());128  EXPECT_EQ(llvm::Triple::Win32, AS.GetTriple().getOS());129  EXPECT_TRUE(130      llvm::StringRef(AS.GetTriple().str()).consume_front("i686-pc-windows"));131  EXPECT_STREQ("i686", AS.GetArchitectureName());132  EXPECT_EQ(ArchSpec::eCore_x86_32_i686, AS.GetCore());133 134  AS = ArchSpec();135  EXPECT_TRUE(AS.SetTriple("msp430---elf"));136  EXPECT_EQ(llvm::Triple::msp430, AS.GetTriple().getArch());137  EXPECT_STREQ("msp430", AS.GetArchitectureName());138  EXPECT_EQ(ArchSpec::eCore_msp430, AS.GetCore());139 140  AS = ArchSpec();141  EXPECT_TRUE(AS.SetTriple("amd64-unknown-openbsd"));142  EXPECT_EQ(llvm::Triple::x86_64, AS.GetTriple().getArch());143  EXPECT_STREQ("amd64", AS.GetArchitectureName());144  EXPECT_EQ(ArchSpec::eCore_x86_64_amd64, AS.GetCore());145 146  // Various flavors of invalid triples.147  AS = ArchSpec();148  EXPECT_FALSE(AS.SetTriple("unknown-unknown-unknown"));149 150  AS = ArchSpec();151  EXPECT_FALSE(AS.SetTriple("unknown"));152 153  AS = ArchSpec();154  EXPECT_FALSE(AS.SetTriple(""));155}156 157TEST(ArchSpecTest, MergeFrom) {158  {159    ArchSpec A;160    ArchSpec B("x86_64-pc-linux");161 162    EXPECT_FALSE(A.IsValid());163    ASSERT_TRUE(B.IsValid());164    EXPECT_EQ(llvm::Triple::ArchType::x86_64, B.GetTriple().getArch());165    EXPECT_EQ(llvm::Triple::VendorType::PC, B.GetTriple().getVendor());166    EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());167    EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, B.GetCore());168 169    A.MergeFrom(B);170    ASSERT_TRUE(A.IsValid());171    EXPECT_EQ(llvm::Triple::ArchType::x86_64, A.GetTriple().getArch());172    EXPECT_EQ(llvm::Triple::VendorType::PC, A.GetTriple().getVendor());173    EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());174    EXPECT_EQ(ArchSpec::eCore_x86_64_x86_64, A.GetCore());175  }176  {177    ArchSpec A("aarch64");178    ArchSpec B("aarch64--linux-android");179 180    ArchSpec C("arm64_32");181    ArchSpec D("arm64_32--watchos");182 183    EXPECT_TRUE(A.IsValid());184    EXPECT_TRUE(B.IsValid());185    EXPECT_TRUE(C.IsValid());186    EXPECT_TRUE(D.IsValid());187 188    EXPECT_EQ(llvm::Triple::ArchType::aarch64, B.GetTriple().getArch());189    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,190              B.GetTriple().getVendor());191    EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());192    EXPECT_EQ(llvm::Triple::EnvironmentType::Android,193              B.GetTriple().getEnvironment());194 195    A.MergeFrom(B);196    EXPECT_EQ(llvm::Triple::ArchType::aarch64, A.GetTriple().getArch());197    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,198              A.GetTriple().getVendor());199    EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());200    EXPECT_EQ(llvm::Triple::EnvironmentType::Android,201              A.GetTriple().getEnvironment());202 203    EXPECT_EQ(llvm::Triple::ArchType::aarch64_32, D.GetTriple().getArch());204    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,205              D.GetTriple().getVendor());206    EXPECT_EQ(llvm::Triple::OSType::WatchOS, D.GetTriple().getOS());207 208    C.MergeFrom(D);209    EXPECT_EQ(llvm::Triple::ArchType::aarch64_32, C.GetTriple().getArch());210    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,211              C.GetTriple().getVendor());212    EXPECT_EQ(llvm::Triple::OSType::WatchOS, C.GetTriple().getOS());213  }214  {215    ArchSpec A, B;216    A.SetArchitecture(eArchTypeELF, llvm::ELF::EM_ARM,217                      LLDB_INVALID_CPUTYPE, llvm::ELF::ELFOSABI_NONE);218    B.SetArchitecture(eArchTypeELF, llvm::ELF::EM_ARM,219                      LLDB_INVALID_CPUTYPE, llvm::ELF::ELFOSABI_LINUX);220 221    EXPECT_TRUE(A.IsValid());222    EXPECT_TRUE(B.IsValid());223 224    EXPECT_EQ(llvm::Triple::ArchType::arm, B.GetTriple().getArch());225    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,226              B.GetTriple().getVendor());227    EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());228    EXPECT_EQ(llvm::Triple::EnvironmentType::UnknownEnvironment,229              B.GetTriple().getEnvironment());230 231    A.MergeFrom(B);232    EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch());233    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,234              A.GetTriple().getVendor());235    EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());236    EXPECT_EQ(llvm::Triple::EnvironmentType::UnknownEnvironment,237              A.GetTriple().getEnvironment());238  }239  {240    ArchSpec A("arm--linux-eabihf");241    ArchSpec B("armv8l--linux-gnueabihf");242 243    EXPECT_TRUE(A.IsValid());244    EXPECT_TRUE(B.IsValid());245 246    EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch());247    EXPECT_EQ(llvm::Triple::ArchType::arm, B.GetTriple().getArch());248 249    EXPECT_EQ(ArchSpec::eCore_arm_generic, A.GetCore());250    EXPECT_EQ(ArchSpec::eCore_arm_armv8l, B.GetCore());251 252    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,253              A.GetTriple().getVendor());254    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,255              B.GetTriple().getVendor());256 257    EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());258    EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());259 260    EXPECT_EQ(llvm::Triple::EnvironmentType::EABIHF,261              A.GetTriple().getEnvironment());262    EXPECT_EQ(llvm::Triple::EnvironmentType::GNUEABIHF,263              B.GetTriple().getEnvironment());264 265    A.MergeFrom(B);266    EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch());267    EXPECT_EQ(ArchSpec::eCore_arm_armv8l, A.GetCore());268    EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,269              A.GetTriple().getVendor());270    EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());271    EXPECT_EQ(llvm::Triple::EnvironmentType::EABIHF,272              A.GetTriple().getEnvironment());273  }274}275 276TEST(ArchSpecTest, MergeFromMachOUnknown) {277  class MyArchSpec : public ArchSpec {278  public:279    MyArchSpec() {280      this->SetTriple("unknown-mach-64");281      this->m_core = ArchSpec::eCore_uknownMach64;282      this->m_byte_order = eByteOrderLittle;283      this->m_flags = 0;284    }285  };286 287  MyArchSpec A;288  ASSERT_TRUE(A.IsValid());289  MyArchSpec B;290  ASSERT_TRUE(B.IsValid());291  A.MergeFrom(B);292  ASSERT_EQ(A.GetCore(), ArchSpec::eCore_uknownMach64);293}294 295TEST(ArchSpecTest, Compatibility) {296  {297    ArchSpec A("x86_64-apple-macosx10.12");298    ArchSpec B("x86_64-apple-macosx10.12");299    ASSERT_TRUE(A.IsExactMatch(B));300    ASSERT_TRUE(A.IsCompatibleMatch(B));301  }302  {303    // The version information is auxiliary to support availability but304    // doesn't affect compatibility.305    ArchSpec A("x86_64-apple-macosx10.11");306    ArchSpec B("x86_64-apple-macosx10.12");307    ASSERT_TRUE(A.IsExactMatch(B));308    ASSERT_TRUE(A.IsCompatibleMatch(B));309  }310  {311    ArchSpec A("x86_64-apple-macosx10.13");312    ArchSpec B("x86_64h-apple-macosx10.13");313    ASSERT_FALSE(A.IsExactMatch(B));314    ASSERT_TRUE(A.IsCompatibleMatch(B));315  }316  {317    ArchSpec A("x86_64-apple-macosx");318    ArchSpec B("x86_64-apple-ios-simulator");319    ASSERT_FALSE(A.IsExactMatch(B));320    ASSERT_FALSE(A.IsCompatibleMatch(B));321  }322  {323    ArchSpec A("x86_64-*-*");324    ArchSpec B("x86_64-apple-ios-simulator");325    ASSERT_FALSE(A.IsExactMatch(B));326    ASSERT_FALSE(A.IsCompatibleMatch(B));327    ASSERT_FALSE(B.IsExactMatch(A));328    ASSERT_FALSE(B.IsCompatibleMatch(A));329  }330  {331    ArchSpec A("x86_64-apple-ios");332    ArchSpec B("x86_64-apple-ios-simulator");333    ASSERT_FALSE(A.IsExactMatch(B));334    ASSERT_FALSE(A.IsCompatibleMatch(B));335    ASSERT_FALSE(B.IsExactMatch(A));336    ASSERT_FALSE(B.IsCompatibleMatch(A));337  }338  {339    // FIXME: This is surprisingly not equivalent to "x86_64-*-*".340    ArchSpec A("x86_64");341    ArchSpec B("x86_64-apple-ios-simulator");342    ASSERT_FALSE(A.IsExactMatch(B));343    ASSERT_TRUE(A.IsCompatibleMatch(B));344    ASSERT_FALSE(B.IsExactMatch(A));345    ASSERT_TRUE(B.IsCompatibleMatch(A));346  }347  {348    ArchSpec A("arm64-apple-ios");349    ArchSpec B("arm64-apple-ios-simulator");350    ASSERT_FALSE(A.IsExactMatch(B));351    ASSERT_FALSE(A.IsCompatibleMatch(B));352    ASSERT_FALSE(B.IsCompatibleMatch(A));353    ASSERT_FALSE(B.IsCompatibleMatch(A));354  }355  {356    ArchSpec A("arm64-*-*");357    ArchSpec B("arm64-apple-ios");358    ASSERT_FALSE(A.IsExactMatch(B));359    // FIXME: This looks unintuitive and we should investigate whether360    // this is the desired behavior.361    ASSERT_FALSE(A.IsCompatibleMatch(B));362  }363  {364    ArchSpec A("x86_64-*-*");365    ArchSpec B("x86_64-apple-ios-simulator");366    ASSERT_FALSE(A.IsExactMatch(B));367    // FIXME: See above, though the extra environment complicates things.368    ASSERT_FALSE(A.IsCompatibleMatch(B));369  }370  {371    ArchSpec A("x86_64");372    ArchSpec B("x86_64-apple-macosx10.14");373    // FIXME: The exact match also looks unintuitive.374    ASSERT_TRUE(A.IsExactMatch(B));375    ASSERT_TRUE(A.IsCompatibleMatch(B));376  }377  {378    ArchSpec A("x86_64");379    ArchSpec B("x86_64-apple-ios12.0.0-macabi");380    // FIXME: The exact match also looks unintuitive.381    ASSERT_TRUE(A.IsExactMatch(B));382    ASSERT_TRUE(A.IsCompatibleMatch(B));383  }384  {385    ArchSpec A("x86_64-apple-ios12.0.0");386    ArchSpec B("x86_64-apple-ios12.0.0-macabi");387    ASSERT_FALSE(A.IsExactMatch(B));388    ASSERT_FALSE(A.IsCompatibleMatch(B));389  }390  {391    ArchSpec A("x86_64-apple-macosx10.14.2");392    ArchSpec B("x86_64-apple-ios12.0.0-macabi");393    ASSERT_FALSE(A.IsExactMatch(B));394    ASSERT_TRUE(A.IsCompatibleMatch(B));395  }396  {397    ArchSpec A("x86_64-apple-macosx10.14.2");398    ArchSpec B("x86_64-apple-ios12.0.0-macabi");399    // ios-macabi wins.400    A.MergeFrom(B);401    ASSERT_TRUE(A.IsExactMatch(B));402  }403  {404    ArchSpec A("x86_64-apple-macosx10.14.2");405    ArchSpec B("x86_64-apple-ios12.0.0-macabi");406    ArchSpec C(B);407    // ios-macabi wins.408    B.MergeFrom(A);409    ASSERT_TRUE(B.IsExactMatch(C));410  }411  {412    ArchSpec A("x86_64-apple-driverkit19.0");413    ArchSpec B("x86_64-apple-macosx10.15.0");414    ASSERT_FALSE(A.IsExactMatch(B));415    ASSERT_TRUE(A.IsCompatibleMatch(B));416  }417}418 419TEST(ArchSpecTest, OperatorBool) {420  EXPECT_FALSE(ArchSpec());421  EXPECT_TRUE(ArchSpec("x86_64-pc-linux"));422}423 424TEST(ArchSpecTest, TripleComponentsWereSpecified) {425  {426    ArchSpec A("");427    ArchSpec B("-");428    ArchSpec C("--");429    ArchSpec D("---");430 431    ASSERT_FALSE(A.TripleVendorWasSpecified());432    ASSERT_FALSE(A.TripleOSWasSpecified());433    ASSERT_FALSE(A.TripleEnvironmentWasSpecified());434 435    ASSERT_FALSE(B.TripleVendorWasSpecified());436    ASSERT_FALSE(B.TripleOSWasSpecified());437    ASSERT_FALSE(B.TripleEnvironmentWasSpecified());438 439    ASSERT_FALSE(C.TripleVendorWasSpecified());440    ASSERT_FALSE(C.TripleOSWasSpecified());441    ASSERT_FALSE(C.TripleEnvironmentWasSpecified());442 443    ASSERT_FALSE(D.TripleVendorWasSpecified());444    ASSERT_FALSE(D.TripleOSWasSpecified());445    ASSERT_FALSE(D.TripleEnvironmentWasSpecified());446  }447  {448    // TODO: llvm::Triple::normalize treats the missing components from these449    // triples as specified unknown components instead of unspecified450    // components. We need to either change the behavior in llvm or work around451    // this in lldb.452    ArchSpec A("armv7");453    ArchSpec B("armv7-");454    ArchSpec C("armv7--");455    ArchSpec D("armv7---");456 457    ASSERT_FALSE(A.TripleVendorWasSpecified());458    ASSERT_FALSE(A.TripleOSWasSpecified());459    ASSERT_FALSE(A.TripleEnvironmentWasSpecified());460 461    ASSERT_TRUE(B.TripleVendorWasSpecified());462    ASSERT_FALSE(B.TripleOSWasSpecified());463    ASSERT_FALSE(B.TripleEnvironmentWasSpecified());464 465    ASSERT_TRUE(C.TripleVendorWasSpecified());466    ASSERT_TRUE(C.TripleOSWasSpecified());467    ASSERT_FALSE(C.TripleEnvironmentWasSpecified());468 469    ASSERT_TRUE(D.TripleVendorWasSpecified());470    ASSERT_TRUE(D.TripleOSWasSpecified());471    ASSERT_TRUE(D.TripleEnvironmentWasSpecified());472  }473  {474    ArchSpec A("x86_64-unknown");475    ArchSpec B("powerpc-unknown-linux");476    ArchSpec C("i386-pc-windows-msvc");477    ArchSpec D("aarch64-unknown-linux-android");478 479    ASSERT_TRUE(A.TripleVendorWasSpecified());480    ASSERT_FALSE(A.TripleOSWasSpecified());481    ASSERT_FALSE(A.TripleEnvironmentWasSpecified());482 483    ASSERT_TRUE(B.TripleVendorWasSpecified());484    ASSERT_TRUE(B.TripleOSWasSpecified());485    ASSERT_FALSE(B.TripleEnvironmentWasSpecified());486 487    ASSERT_TRUE(C.TripleVendorWasSpecified());488    ASSERT_TRUE(C.TripleOSWasSpecified());489    ASSERT_TRUE(C.TripleEnvironmentWasSpecified());490 491    ASSERT_TRUE(D.TripleVendorWasSpecified());492    ASSERT_TRUE(D.TripleOSWasSpecified());493    ASSERT_TRUE(D.TripleEnvironmentWasSpecified());494  }495}496