Files
clang-p2996/llvm/unittests/CodeGen/TestAsmPrinter.cpp
Reid Kleckner 89b57061f7 Move TargetRegistry.(h|cpp) from Support to MC
This moves the registry higher in the LLVM library dependency stack.
Every client of the target registry needs to link against MC anyway to
actually use the target, so we might as well move this out of Support.

This allows us to ensure that Support doesn't have includes from MC/*.

Differential Revision: https://reviews.llvm.org/D111454
2021-10-08 14:51:48 -07:00

91 lines
3.3 KiB
C++

//===--- unittests/CodeGen/TestAsmPrinter.cpp -------------------*- C++ -*-===//
//
// 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 "TestAsmPrinter.h"
#include "llvm/ADT/Triple.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetMachine.h"
using namespace llvm;
using ::testing::StrictMock;
// Note: a non-const reference argument cannot be passed through
// testing::StrictMock, thus, we pass a pointer and dereference it here.
MockMCStreamer::MockMCStreamer(MCContext *Ctx) : MCStreamer(*Ctx) {}
MockMCStreamer::~MockMCStreamer() = default;
TestAsmPrinter::TestAsmPrinter() = default;
TestAsmPrinter::~TestAsmPrinter() = default;
llvm::Expected<std::unique_ptr<TestAsmPrinter>>
TestAsmPrinter::create(const std::string &TripleStr, uint16_t DwarfVersion,
dwarf::DwarfFormat DwarfFormat) {
std::string ErrorStr;
const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrorStr);
if (!TheTarget)
return std::unique_ptr<TestAsmPrinter>();
std::unique_ptr<TestAsmPrinter> TestPrinter(new TestAsmPrinter);
if (llvm::Error E =
TestPrinter->init(TheTarget, TripleStr, DwarfVersion, DwarfFormat))
return std::move(E);
return std::move(TestPrinter);
}
// Note:: based on dwarfgen::Generator::init() from
// llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp
llvm::Error TestAsmPrinter::init(const Target *TheTarget, StringRef TripleName,
uint16_t DwarfVersion,
dwarf::DwarfFormat DwarfFormat) {
TM.reset(TheTarget->createTargetMachine(TripleName, "", "", TargetOptions(),
None));
if (!TM)
return make_error<StringError>("no target machine for target " + TripleName,
inconvertibleErrorCode());
Triple TheTriple(TripleName);
MC.reset(new MCContext(TheTriple, TM->getMCAsmInfo(), TM->getMCRegisterInfo(),
TM->getMCSubtargetInfo()));
TM->getObjFileLowering()->Initialize(*MC, *TM);
MC->setObjectFileInfo(TM->getObjFileLowering());
MS = new StrictMock<MockMCStreamer>(MC.get());
Asm.reset(
TheTarget->createAsmPrinter(*TM, std::unique_ptr<MockMCStreamer>(MS)));
if (!Asm)
return make_error<StringError>("no asm printer for target " + TripleName,
inconvertibleErrorCode());
// Set the DWARF version correctly on all classes that we use.
MC->setDwarfVersion(DwarfVersion);
Asm->setDwarfVersion(DwarfVersion);
// Set the DWARF format.
MC->setDwarfFormat(DwarfFormat);
return Error::success();
}
void TestAsmPrinter::setDwarfUsesRelocationsAcrossSections(bool Enable) {
struct HackMCAsmInfo : MCAsmInfo {
void setDwarfUsesRelocationsAcrossSections(bool Enable) {
DwarfUsesRelocationsAcrossSections = Enable;
}
};
static_cast<HackMCAsmInfo *>(const_cast<MCAsmInfo *>(TM->getMCAsmInfo()))
->setDwarfUsesRelocationsAcrossSections(Enable);
}