blob: ed0aff788cfd0fcc01274b6ad162914e53ccb3c5 [file] [edit]
//===-------------- ManglerTest.cpp - Unit tests for Mangler --------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/ExecutionEngine/Orc/Shared/Mangler.h"
#include "llvm/ExecutionEngine/Orc/Shared/SymbolNameSpec.h"
#include "OrcTestCommon.h"
using namespace llvm;
using namespace llvm::orc;
namespace {
struct ManglingCase {
StringRef Triple;
StringRef Input;
StringRef Expected;
};
} // namespace
TEST(ManglerTest, FromTripleAcrossFormats) {
static const ManglingCase Cases[] = {
// ELF: no prefix.
{"x86_64-unknown-linux-gnu", "foo", "foo"},
// MachO: leading underscore.
{"x86_64-apple-darwin", "foo", "_foo"},
{"arm64-apple-darwin", "foo", "_foo"},
// Windows COFF, x86_64: no prefix.
{"x86_64-pc-windows-msvc", "foo", "foo"},
// Windows COFF, x86 (32-bit): leading underscore.
{"i686-pc-windows-msvc", "foo", "_foo"},
// AIX XCOFF: no prefix.
{"powerpc64-ibm-aix", "foo", "foo"},
// z/OS GOFF: no prefix.
{"s390x-ibm-zos", "foo", "foo"},
// MIPS O32: no prefix.
{"mipsel-unknown-linux-gnu", "foo", "foo"},
};
for (const auto &C : Cases) {
SCOPED_TRACE(C.Triple);
Mangler Mangle(Triple(C.Triple));
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::ir(C.Input)), C.Expected);
}
}
TEST(ManglerTest, DoNotMangleLeadingBackslash1) {
Mangler Mangle(Triple("x86_64-apple-darwin"));
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::ir("\1foo")), "foo");
}
TEST(ManglerTest, WindowsQuestionMarkNotMangled) {
Mangler Mangle(Triple("x86_64-pc-windows-msvc"));
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::ir("?foo@@YAHXZ")),
"?foo@@YAHXZ");
}
TEST(ManglerTest, MachOQuestionMarkIsMangled) {
// MachO has no question-mark suppression: gets the usual '_' prefix.
Mangler Mangle(Triple("x86_64-apple-darwin"));
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::ir("?foo")), "_?foo");
}
TEST(ManglerTest, ExplicitManglingMode) {
Mangler Mangle(Mangler::Mode::MachO);
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::ir("foo")), "_foo");
}
// Use a MachO triple so that mangling ("_" prefix) is observably different from
// interning verbatim.
TEST(ManglerTest, SymbolNameSpecKindDispatch) {
Mangler Mangle(Triple("x86_64-apple-darwin"));
// Verbatim and Linker are interned unmodified.
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::verbatim("foo")), "foo");
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::linker("foo")), "foo");
// IR and C are mangled (leading "_" on MachO).
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::ir("foo")), "_foo");
EXPECT_EQ(Mangle.mangledCopy(SymbolNameSpec::c("foo")), "_foo");
}