xref: /llvm-project/llvm/unittests/MC/TargetRegistry.cpp (revision 89b57061f7b769e9ea9bf6ed686e284f3e55affe)
117495274SReid Kleckner //===- unittests/MC/TargetRegistry.cpp ------------------------------------===//
217495274SReid Kleckner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
617495274SReid Kleckner //
717495274SReid Kleckner //===----------------------------------------------------------------------===//
817495274SReid Kleckner 
917495274SReid Kleckner // The target registry code lives in Support, but it relies on linking in all
1017495274SReid Kleckner // LLVM targets. We keep this test with the MC tests, which already do that, to
1117495274SReid Kleckner // keep the SupportTests target small.
1217495274SReid Kleckner 
13*89b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
1417495274SReid Kleckner #include "llvm/Support/TargetSelect.h"
1517495274SReid Kleckner #include "gtest/gtest.h"
1617495274SReid Kleckner 
1717495274SReid Kleckner using namespace llvm;
1817495274SReid Kleckner 
1917495274SReid Kleckner namespace {
2017495274SReid Kleckner 
TEST(TargetRegistry,TargetHasArchType)2117495274SReid Kleckner TEST(TargetRegistry, TargetHasArchType) {
2217495274SReid Kleckner   // Presence of at least one target will be asserted when done with the loop,
2317495274SReid Kleckner   // else this would pass by accident if InitializeAllTargetInfos were omitted.
2417495274SReid Kleckner   int Count = 0;
2517495274SReid Kleckner 
2617495274SReid Kleckner   llvm::InitializeAllTargetInfos();
2717495274SReid Kleckner 
2817495274SReid Kleckner   for (const Target &T : TargetRegistry::targets()) {
2917495274SReid Kleckner     StringRef Name = T.getName();
3017495274SReid Kleckner     // There is really no way (at present) to ask a Target whether it targets
3117495274SReid Kleckner     // a specific architecture, because the logic for that is buried in a
3217495274SReid Kleckner     // predicate.
3317495274SReid Kleckner     // We can't ask the predicate "Are you a function that always returns
3417495274SReid Kleckner     // false?"
3517495274SReid Kleckner     // So given that the cpp backend truly has no target arch, it is skipped.
3617495274SReid Kleckner     if (Name != "cpp") {
3717495274SReid Kleckner       Triple::ArchType Arch = Triple::getArchTypeForLLVMName(Name);
3817495274SReid Kleckner       EXPECT_NE(Arch, Triple::UnknownArch);
3917495274SReid Kleckner       ++Count;
4017495274SReid Kleckner     }
4117495274SReid Kleckner   }
4217495274SReid Kleckner   ASSERT_NE(Count, 0);
4317495274SReid Kleckner }
4417495274SReid Kleckner 
4517495274SReid Kleckner } // end namespace
46