Skip to content

Commit 219d80b

Browse files
committed
MCAssembler: Move FileNames and CompilerVersion to MCObjectWriter
1 parent e7a2405 commit 219d80b

File tree

8 files changed

+32
-31
lines changed

8 files changed

+32
-31
lines changed

llvm/include/llvm/MC/MCAssembler.h

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class MCValue;
5252

5353
class MCAssembler {
5454
public:
55+
friend class MCObjectWriter;
5556
using SectionListType = SmallVector<MCSection *, 0>;
5657
using const_iterator = pointee_iterator<SectionListType::const_iterator>;
5758

@@ -73,11 +74,6 @@ class MCAssembler {
7374
/// The list of linker options to propagate into the object file.
7475
std::vector<std::vector<std::string>> LinkerOptions;
7576

76-
/// List of declared file names
77-
std::vector<std::pair<std::string, size_t>> FileNames;
78-
// Optional compiler version.
79-
std::string CompilerVersion;
80-
8177
MCDwarfLineTableParams LTParams;
8278

8379
/// The set of function symbols for which a .thumb_func directive has
@@ -261,20 +257,6 @@ class MCAssembler {
261257
bool registerSection(MCSection &Section);
262258
bool registerSymbol(const MCSymbol &Symbol);
263259

264-
MutableArrayRef<std::pair<std::string, size_t>> getFileNames() {
265-
return FileNames;
266-
}
267-
268-
void addFileName(StringRef FileName) {
269-
FileNames.emplace_back(std::string(FileName), Symbols.size());
270-
}
271-
272-
void setCompilerVersion(std::string CompilerVers) {
273-
if (CompilerVersion.empty())
274-
CompilerVersion = std::move(CompilerVers);
275-
}
276-
StringRef getCompilerVersion() { return CompilerVersion; }
277-
278260
/// Write the necessary bundle padding to \p OS.
279261
/// Expects a fragment \p F containing instructions and its size \p FSize.
280262
void writeFragmentPadding(raw_ostream &OS, const MCEncodedFragment &F,

llvm/include/llvm/MC/MCObjectWriter.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ class MCValue;
3232
/// should be emitted as part of writeObject().
3333
class MCObjectWriter {
3434
protected:
35+
/// List of declared file names
36+
SmallVector<std::pair<std::string, size_t>, 0> FileNames;
37+
// XCOFF specific: Optional compiler version.
38+
std::string CompilerVersion;
3539
std::vector<const MCSymbol *> AddrsigSyms;
3640
bool EmitAddrsigSection = false;
3741

@@ -43,7 +47,7 @@ class MCObjectWriter {
4347
virtual ~MCObjectWriter();
4448

4549
/// lifetime management
46-
virtual void reset() {}
50+
virtual void reset();
4751

4852
/// \name High-Level API
4953
/// @{
@@ -81,6 +85,14 @@ class MCObjectWriter {
8185
bool InSet,
8286
bool IsPCRel) const;
8387

88+
MutableArrayRef<std::pair<std::string, size_t>> getFileNames() {
89+
return FileNames;
90+
}
91+
void addFileName(MCAssembler &Asm, StringRef FileName);
92+
void setCompilerVersion(StringRef CompilerVers) {
93+
CompilerVersion = CompilerVers;
94+
}
95+
8496
/// Tell the object writer to emit an address-significance table during
8597
/// writeObject(). If this function is not called, all symbols are treated as
8698
/// address-significant.

llvm/lib/MC/ELFObjectWriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ void ELFWriter::computeSymbolTable(MCAssembler &Asm,
560560
std::vector<ELFSymbolData> LocalSymbolData;
561561
std::vector<ELFSymbolData> ExternalSymbolData;
562562
MutableArrayRef<std::pair<std::string, size_t>> FileNames =
563-
Asm.getFileNames();
563+
OWriter.getFileNames();
564564
for (const std::pair<std::string, size_t> &F : FileNames)
565565
StrTabBuilder.add(F.first);
566566

llvm/lib/MC/MCAssembler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ void MCAssembler::reset() {
9494
Sections.clear();
9595
Symbols.clear();
9696
LinkerOptions.clear();
97-
FileNames.clear();
9897
ThumbFuncs.clear();
9998
BundleAlignSize = 0;
10099

llvm/lib/MC/MCObjectStreamer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -784,15 +784,18 @@ void MCObjectStreamer::emitNops(int64_t NumBytes, int64_t ControlledNopLength,
784784
}
785785

786786
void MCObjectStreamer::emitFileDirective(StringRef Filename) {
787-
getAssembler().addFileName(Filename);
787+
MCAssembler &Asm = getAssembler();
788+
Asm.getWriter().addFileName(Asm, Filename);
788789
}
789790

790791
void MCObjectStreamer::emitFileDirective(StringRef Filename,
791792
StringRef CompilerVersion,
792793
StringRef TimeStamp,
793794
StringRef Description) {
794-
getAssembler().addFileName(Filename);
795-
getAssembler().setCompilerVersion(CompilerVersion.str());
795+
MCObjectWriter &W = getAssembler().getWriter();
796+
W.addFileName(getAssembler(), Filename);
797+
if (CompilerVersion.size())
798+
W.setCompilerVersion(CompilerVersion);
796799
// TODO: add TimeStamp and Description to .file symbol table entry
797800
// with the integrated assembler.
798801
}

llvm/lib/MC/MCObjectWriter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/MC/MCObjectWriter.h"
10+
#include "llvm/MC/MCAssembler.h"
1011
#include "llvm/MC/MCExpr.h"
1112
#include "llvm/MC/MCFragment.h"
1213
#include "llvm/MC/MCSymbol.h"
@@ -18,6 +19,8 @@ using namespace llvm;
1819

1920
MCObjectWriter::~MCObjectWriter() = default;
2021

22+
void MCObjectWriter::reset() { FileNames.clear(); }
23+
2124
bool MCObjectWriter::isSymbolRefDifferenceFullyResolved(
2225
const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B,
2326
bool InSet) const {
@@ -44,3 +47,7 @@ bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
4447
// On ELF and COFF A - B is absolute if A and B are in the same section.
4548
return &SecA == &SecB;
4649
}
50+
51+
void MCObjectWriter::addFileName(MCAssembler &Asm, StringRef FileName) {
52+
FileNames.emplace_back(std::string(FileName), Asm.Symbols.size());
53+
}

llvm/lib/MC/WinCOFFObjectWriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ void WinCOFFWriter::writeSection(MCAssembler &Asm, const COFFSection &Sec) {
636636

637637
// Create .file symbols.
638638
void WinCOFFWriter::createFileSymbols(MCAssembler &Asm) {
639-
for (const std::pair<std::string, size_t> &It : Asm.getFileNames()) {
639+
for (const std::pair<std::string, size_t> &It : OWriter.getFileNames()) {
640640
// round up to calculate the number of auxiliary symbols required
641641
const std::string &Name = It.first;
642642
unsigned SymbolSize = UseBigObj ? COFF::Symbol32Size : COFF::Symbol16Size;

llvm/lib/MC/XCOFFObjectWriter.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,6 @@ class XCOFFObjectWriter : public MCObjectWriter {
296296
uint64_t SymbolTableOffset = 0;
297297
uint16_t SectionCount = 0;
298298
uint32_t PaddingsBeforeDwarf = 0;
299-
std::vector<std::pair<std::string, size_t>> FileNames;
300299
bool HasVisibility = false;
301300

302301
support::endian::Writer W;
@@ -638,7 +637,6 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm) {
638637
if (CISI && nameShouldBeInStringTable(CISI->Name))
639638
Strings.add(CISI->Name);
640639

641-
FileNames = Asm.getFileNames();
642640
// Emit ".file" as the source file name when there is no file name.
643641
if (FileNames.empty())
644642
FileNames.emplace_back(".file", 0);
@@ -651,7 +649,7 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm) {
651649
// the AUX_FILE auxiliary entry.
652650
if (nameShouldBeInStringTable(".file"))
653651
Strings.add(".file");
654-
StringRef Vers = Asm.getCompilerVersion();
652+
StringRef Vers = CompilerVersion;
655653
if (auxFileSymNameShouldBeInStringTable(Vers))
656654
Strings.add(Vers);
657655

@@ -1161,7 +1159,7 @@ void XCOFFObjectWriter::writeRelocations() {
11611159

11621160
void XCOFFObjectWriter::writeSymbolTable(MCAssembler &Asm) {
11631161
// Write C_FILE symbols.
1164-
StringRef Vers = Asm.getCompilerVersion();
1162+
StringRef Vers = CompilerVersion;
11651163

11661164
for (const std::pair<std::string, size_t> &F : FileNames) {
11671165
// The n_name of a C_FILE symbol is the source file's name when no auxiliary
@@ -1417,7 +1415,7 @@ void XCOFFObjectWriter::assignAddressesAndIndices(MCAssembler &Asm) {
14171415
// The symbol table starts with all the C_FILE symbols. Each C_FILE symbol
14181416
// requires 1 or 2 auxiliary entries.
14191417
uint32_t SymbolTableIndex =
1420-
(2 + (Asm.getCompilerVersion().empty() ? 0 : 1)) * FileNames.size();
1418+
(2 + (CompilerVersion.empty() ? 0 : 1)) * FileNames.size();
14211419

14221420
if (CInfoSymSection.Entry)
14231421
SymbolTableIndex++;

0 commit comments

Comments
 (0)