Mercurial > hg > CbC > CbC_llvm
comparison llvm/unittests/CodeGen/TestAsmPrinter.cpp @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | |
children | c4bab56944e8 |
comparison
equal
deleted
inserted
replaced
220:42394fc6a535 | 221:79ff65ed7e25 |
---|---|
1 //===--- unittests/CodeGen/TestAsmPrinter.cpp -------------------*- C++ -*-===// | |
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-exception | |
6 // | |
7 //===----------------------------------------------------------------------===// | |
8 | |
9 #include "TestAsmPrinter.h" | |
10 #include "llvm/ADT/Triple.h" | |
11 #include "llvm/CodeGen/AsmPrinter.h" | |
12 #include "llvm/MC/MCAsmInfo.h" | |
13 #include "llvm/MC/MCContext.h" | |
14 #include "llvm/Support/TargetRegistry.h" | |
15 #include "llvm/Target/TargetLoweringObjectFile.h" | |
16 #include "llvm/Target/TargetMachine.h" | |
17 | |
18 using namespace llvm; | |
19 using ::testing::StrictMock; | |
20 | |
21 // Note: a non-const reference argument cannot be passed through | |
22 // testing::StrictMock, thus, we pass a pointer and dereference it here. | |
23 MockMCStreamer::MockMCStreamer(MCContext *Ctx) : MCStreamer(*Ctx) {} | |
24 | |
25 MockMCStreamer::~MockMCStreamer() = default; | |
26 | |
27 TestAsmPrinter::TestAsmPrinter() = default; | |
28 | |
29 TestAsmPrinter::~TestAsmPrinter() = default; | |
30 | |
31 llvm::Expected<std::unique_ptr<TestAsmPrinter>> | |
32 TestAsmPrinter::create(const std::string &TripleStr, uint16_t DwarfVersion, | |
33 dwarf::DwarfFormat DwarfFormat) { | |
34 std::string ErrorStr; | |
35 const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrorStr); | |
36 if (!TheTarget) | |
37 return std::unique_ptr<TestAsmPrinter>(); | |
38 | |
39 std::unique_ptr<TestAsmPrinter> TestPrinter(new TestAsmPrinter); | |
40 if (llvm::Error E = | |
41 TestPrinter->init(TheTarget, TripleStr, DwarfVersion, DwarfFormat)) | |
42 return std::move(E); | |
43 | |
44 return std::move(TestPrinter); | |
45 } | |
46 | |
47 // Note:: based on dwarfgen::Generator::init() from | |
48 // llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp | |
49 llvm::Error TestAsmPrinter::init(const Target *TheTarget, StringRef TripleName, | |
50 uint16_t DwarfVersion, | |
51 dwarf::DwarfFormat DwarfFormat) { | |
52 TM.reset(TheTarget->createTargetMachine(TripleName, "", "", TargetOptions(), | |
53 None)); | |
54 if (!TM) | |
55 return make_error<StringError>("no target machine for target " + TripleName, | |
56 inconvertibleErrorCode()); | |
57 | |
58 Triple TheTriple(TripleName); | |
59 MC.reset(new MCContext(TheTriple, TM->getMCAsmInfo(), TM->getMCRegisterInfo(), | |
60 TM->getMCSubtargetInfo())); | |
61 TM->getObjFileLowering()->Initialize(*MC, *TM); | |
62 MC->setObjectFileInfo(TM->getObjFileLowering()); | |
63 | |
64 MS = new StrictMock<MockMCStreamer>(MC.get()); | |
65 | |
66 Asm.reset( | |
67 TheTarget->createAsmPrinter(*TM, std::unique_ptr<MockMCStreamer>(MS))); | |
68 if (!Asm) | |
69 return make_error<StringError>("no asm printer for target " + TripleName, | |
70 inconvertibleErrorCode()); | |
71 | |
72 // Set the DWARF version correctly on all classes that we use. | |
73 MC->setDwarfVersion(DwarfVersion); | |
74 Asm->setDwarfVersion(DwarfVersion); | |
75 | |
76 // Set the DWARF format. | |
77 MC->setDwarfFormat(DwarfFormat); | |
78 | |
79 return Error::success(); | |
80 } | |
81 | |
82 void TestAsmPrinter::setDwarfUsesRelocationsAcrossSections(bool Enable) { | |
83 struct HackMCAsmInfo : MCAsmInfo { | |
84 void setDwarfUsesRelocationsAcrossSections(bool Enable) { | |
85 DwarfUsesRelocationsAcrossSections = Enable; | |
86 } | |
87 }; | |
88 static_cast<HackMCAsmInfo *>(const_cast<MCAsmInfo *>(TM->getMCAsmInfo())) | |
89 ->setDwarfUsesRelocationsAcrossSections(Enable); | |
90 } |