Imported Upstream version 5.18.0.207

Former-commit-id: 3b152f462918d427ce18620a2cbe4f8b79650449
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-11-17 08:23:10 +00:00
parent 8e12397d70
commit eb85e2fc17
28480 changed files with 72 additions and 3866936 deletions

View File

@@ -1,13 +0,0 @@
set(LLVM_LINK_COMPONENTS
${LLVM_TARGETS_TO_BUILD}
MC
MCDisassembler
Support
)
add_llvm_unittest(MCTests
Disassembler.cpp
DwarfLineTables.cpp
StringTableBuilderTest.cpp
TargetRegistry.cpp
)

View File

@@ -1,64 +0,0 @@
//===- llvm/unittest/Object/Disassembler.cpp ------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm-c/Disassembler.h"
#include "llvm/Support/TargetSelect.h"
#include "gtest/gtest.h"
using namespace llvm;
static const char *symbolLookupCallback(void *DisInfo, uint64_t ReferenceValue,
uint64_t *ReferenceType,
uint64_t ReferencePC,
const char **ReferenceName) {
*ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
return nullptr;
}
TEST(Disassembler, Test1) {
llvm::InitializeAllTargetInfos();
llvm::InitializeAllTargetMCs();
llvm::InitializeAllDisassemblers();
uint8_t Bytes[] = {0x90, 0x90, 0xeb, 0xfd};
uint8_t *BytesP = Bytes;
const char OutStringSize = 100;
char OutString[OutStringSize];
LLVMDisasmContextRef DCR = LLVMCreateDisasm("x86_64-pc-linux", nullptr, 0,
nullptr, symbolLookupCallback);
if (!DCR)
return;
size_t InstSize;
unsigned NumBytes = sizeof(Bytes);
unsigned PC = 0;
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
OutStringSize);
EXPECT_EQ(InstSize, 1U);
EXPECT_EQ(StringRef(OutString), "\tnop");
PC += InstSize;
BytesP += InstSize;
NumBytes -= InstSize;
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
OutStringSize);
EXPECT_EQ(InstSize, 1U);
EXPECT_EQ(StringRef(OutString), "\tnop");
PC += InstSize;
BytesP += InstSize;
NumBytes -= InstSize;
InstSize = LLVMDisasmInstruction(DCR, BytesP, NumBytes, PC, OutString,
OutStringSize);
EXPECT_EQ(InstSize, 2U);
EXPECT_EQ(StringRef(OutString), "\tjmp\t0x1");
LLVMDisasmDispose(DCR);
}

View File

@@ -1,183 +0,0 @@
//===- llvm/unittest/MC/DwarfLineTables.cpp ------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/STLExtras.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCDwarf.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "gtest/gtest.h"
using namespace llvm;
namespace {
struct Context {
const char *Triple = "x86_64-pc-linux";
std::unique_ptr<MCRegisterInfo> MRI;
std::unique_ptr<MCAsmInfo> MAI;
std::unique_ptr<MCContext> Ctx;
Context() {
llvm::InitializeAllTargetInfos();
llvm::InitializeAllTargetMCs();
llvm::InitializeAllDisassemblers();
// If we didn't build x86, do not run the test.
std::string Error;
const Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
if (!TheTarget)
return;
MRI.reset(TheTarget->createMCRegInfo(Triple));
MAI.reset(TheTarget->createMCAsmInfo(*MRI, Triple));
Ctx = llvm::make_unique<MCContext>(MAI.get(), MRI.get(), nullptr);
}
operator bool() { return Ctx.get(); }
operator MCContext &() { return *Ctx; };
};
Context &getContext() {
static Context Ctxt;
return Ctxt;
}
}
void verifyEncoding(MCDwarfLineTableParams Params, int LineDelta, int AddrDelta,
ArrayRef<uint8_t> ExpectedEncoding) {
SmallString<16> Buffer;
raw_svector_ostream EncodingOS(Buffer);
MCDwarfLineAddr::Encode(getContext(), Params, LineDelta, AddrDelta,
EncodingOS);
ArrayRef<uint8_t> Encoding(reinterpret_cast<uint8_t *>(Buffer.data()),
Buffer.size());
EXPECT_EQ(ExpectedEncoding, Encoding);
}
TEST(DwarfLineTables, TestDefaultParams) {
if (!getContext())
return;
MCDwarfLineTableParams Params;
// Minimal line offset expressible through extended opcode, 0 addr delta
const uint8_t Encoding0[] = {13}; // Special opcode Addr += 0, Line += -5
verifyEncoding(Params, -5, 0, Encoding0);
// Maximal line offset expressible through extended opcode,
const uint8_t Encoding1[] = {26}; // Special opcode Addr += 0, Line += +8
verifyEncoding(Params, 8, 0, Encoding1);
// Random value in the middle of the special ocode range
const uint8_t Encoding2[] = {146}; // Special opcode Addr += 9, Line += 2
verifyEncoding(Params, 2, 9, Encoding2);
// Minimal line offset expressible through extended opcode, max addr delta
const uint8_t Encoding3[] = {251}; // Special opcode Addr += 17, Line += -5
verifyEncoding(Params, -5, 17, Encoding3);
// Biggest special opcode
const uint8_t Encoding4[] = {255}; // Special opcode Addr += 17, Line += -1
verifyEncoding(Params, -1, 17, Encoding4);
// Line delta outside of the special opcode range, address delta in range
const uint8_t Encoding5[] = {dwarf::DW_LNS_advance_line, 9,
158}; // Special opcode Addr += 10, Line += 0
verifyEncoding(Params, 9, 10, Encoding5);
// Address delta outside of the special opcode range, but small
// enough to do DW_LNS_const_add_pc + special opcode.
const uint8_t Encoding6[] = {dwarf::DW_LNS_const_add_pc, // pc += 17
62}; // Special opcode Addr += 3, Line += 2
verifyEncoding(Params, 2, 20, Encoding6);
// Address delta big enough to require the use of DW_LNS_advance_pc
// Line delta in special opcode range
const uint8_t Encoding7[] = {dwarf::DW_LNS_advance_pc, 100,
20}; // Special opcode Addr += 0, Line += 2
verifyEncoding(Params, 2, 100, Encoding7);
// No special opcode possible.
const uint8_t Encoding8[] = {dwarf::DW_LNS_advance_line, 20,
dwarf::DW_LNS_advance_pc, 100,
dwarf::DW_LNS_copy};
verifyEncoding(Params, 20, 100, Encoding8);
}
TEST(DwarfLineTables, TestCustomParams) {
if (!getContext())
return;
// Some tests against the example values given in the standard.
MCDwarfLineTableParams Params;
Params.DWARF2LineOpcodeBase = 13;
Params.DWARF2LineBase = -3;
Params.DWARF2LineRange = 12;
// Minimal line offset expressible through extended opcode, 0 addr delta
const uint8_t Encoding0[] = {13}; // Special opcode Addr += 0, Line += -5
verifyEncoding(Params, -3, 0, Encoding0);
// Maximal line offset expressible through extended opcode,
const uint8_t Encoding1[] = {24}; // Special opcode Addr += 0, Line += +8
verifyEncoding(Params, 8, 0, Encoding1);
// Random value in the middle of the special ocode range
const uint8_t Encoding2[] = {126}; // Special opcode Addr += 9, Line += 2
verifyEncoding(Params, 2, 9, Encoding2);
// Minimal line offset expressible through extended opcode, max addr delta
const uint8_t Encoding3[] = {253}; // Special opcode Addr += 20, Line += -3
verifyEncoding(Params, -3, 20, Encoding3);
// Biggest special opcode
const uint8_t Encoding4[] = {255}; // Special opcode Addr += 17, Line += -1
verifyEncoding(Params, -1, 20, Encoding4);
// Line delta outside of the special opcode range, address delta in range
const uint8_t Encoding5[] = {dwarf::DW_LNS_advance_line, 9,
136}; // Special opcode Addr += 10, Line += 0
verifyEncoding(Params, 9, 10, Encoding5);
// Address delta outside of the special opcode range, but small
// enough to do DW_LNS_const_add_pc + special opcode.
const uint8_t Encoding6[] = {dwarf::DW_LNS_const_add_pc, // pc += 20
138}; // Special opcode Addr += 10, Line += 2
verifyEncoding(Params, 2, 30, Encoding6);
// Address delta big enough to require the use of DW_LNS_advance_pc
// Line delta in special opcode range
const uint8_t Encoding7[] = {dwarf::DW_LNS_advance_pc, 100,
18}; // Special opcode Addr += 0, Line += 2
verifyEncoding(Params, 2, 100, Encoding7);
// No special opcode possible.
const uint8_t Encoding8[] = {dwarf::DW_LNS_advance_line, 20,
dwarf::DW_LNS_advance_pc, 100,
dwarf::DW_LNS_copy};
verifyEncoding(Params, 20, 100, Encoding8);
}
TEST(DwarfLineTables, TestCustomParams2) {
if (!getContext())
return;
// Corner case param values.
MCDwarfLineTableParams Params;
Params.DWARF2LineOpcodeBase = 13;
Params.DWARF2LineBase = 1;
Params.DWARF2LineRange = 255;
const uint8_t Encoding0[] = {dwarf::DW_LNS_advance_line, 248, 1,
dwarf::DW_LNS_copy};
verifyEncoding(Params, 248, 0, Encoding0);
}

View File

@@ -1,107 +0,0 @@
//===----------- StringTableBuilderTest.cpp -------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Endian.h"
#include "gtest/gtest.h"
#include <string>
using namespace llvm;
namespace {
TEST(StringTableBuilderTest, BasicELF) {
StringTableBuilder B(StringTableBuilder::ELF);
B.add("foo");
B.add("bar");
B.add("foobar");
B.finalize();
std::string Expected;
Expected += '\x00';
Expected += "foobar";
Expected += '\x00';
Expected += "foo";
Expected += '\x00';
SmallString<64> Data;
raw_svector_ostream OS(Data);
B.write(OS);
EXPECT_EQ(Expected, Data);
EXPECT_EQ(1U, B.getOffset("foobar"));
EXPECT_EQ(4U, B.getOffset("bar"));
EXPECT_EQ(8U, B.getOffset("foo"));
}
TEST(StringTableBuilderTest, BasicWinCOFF) {
StringTableBuilder B(StringTableBuilder::WinCOFF);
// Strings must be 9 chars or longer to go in the table.
B.add("hippopotamus");
B.add("pygmy hippopotamus");
B.add("river horse");
B.finalize();
// size_field + "pygmy hippopotamus\0" + "river horse\0"
uint32_t ExpectedSize = 4 + 19 + 12;
EXPECT_EQ(ExpectedSize, B.getSize());
std::string Expected;
ExpectedSize =
support::endian::byte_swap<uint32_t, support::little>(ExpectedSize);
Expected.append((const char*)&ExpectedSize, 4);
Expected += "pygmy hippopotamus";
Expected += '\x00';
Expected += "river horse";
Expected += '\x00';
SmallString<64> Data;
raw_svector_ostream OS(Data);
B.write(OS);
EXPECT_EQ(Expected, Data);
EXPECT_EQ(4U, B.getOffset("pygmy hippopotamus"));
EXPECT_EQ(10U, B.getOffset("hippopotamus"));
EXPECT_EQ(23U, B.getOffset("river horse"));
}
TEST(StringTableBuilderTest, ELFInOrder) {
StringTableBuilder B(StringTableBuilder::ELF);
EXPECT_EQ(1U, B.add("foo"));
EXPECT_EQ(5U, B.add("bar"));
EXPECT_EQ(9U, B.add("foobar"));
B.finalizeInOrder();
std::string Expected;
Expected += '\x00';
Expected += "foo";
Expected += '\x00';
Expected += "bar";
Expected += '\x00';
Expected += "foobar";
Expected += '\x00';
SmallString<64> Data;
raw_svector_ostream OS(Data);
B.write(OS);
EXPECT_EQ(Expected, Data);
EXPECT_EQ(1U, B.getOffset("foo"));
EXPECT_EQ(5U, B.getOffset("bar"));
EXPECT_EQ(9U, B.getOffset("foobar"));
}
}

View File

@@ -1,46 +0,0 @@
//===- unittests/MC/TargetRegistry.cpp ------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// The target registry code lives in Support, but it relies on linking in all
// LLVM targets. We keep this test with the MC tests, which already do that, to
// keep the SupportTests target small.
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "gtest/gtest.h"
using namespace llvm;
namespace {
TEST(TargetRegistry, TargetHasArchType) {
// Presence of at least one target will be asserted when done with the loop,
// else this would pass by accident if InitializeAllTargetInfos were omitted.
int Count = 0;
llvm::InitializeAllTargetInfos();
for (const Target &T : TargetRegistry::targets()) {
StringRef Name = T.getName();
// There is really no way (at present) to ask a Target whether it targets
// a specific architecture, because the logic for that is buried in a
// predicate.
// We can't ask the predicate "Are you a function that always returns
// false?"
// So given that the cpp backend truly has no target arch, it is skipped.
if (Name != "cpp") {
Triple::ArchType Arch = Triple::getArchTypeForLLVMName(Name);
EXPECT_NE(Arch, Triple::UnknownArch);
++Count;
}
}
ASSERT_NE(Count, 0);
}
} // end namespace