LLVM 23.0.0git
ELFEmitter.cpp
Go to the documentation of this file.
1//===- yaml2elf - Convert YAML to a ELF object file -----------------------===//
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/// \file
10/// The ELF component of yaml2obj.
11///
12//===----------------------------------------------------------------------===//
13
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/DenseMap.h"
16#include "llvm/ADT/SetVector.h"
17#include "llvm/ADT/StringSet.h"
26#include "llvm/Support/Errc.h"
27#include "llvm/Support/Error.h"
28#include "llvm/Support/LEB128.h"
32#include <optional>
33
34using namespace llvm;
35
36// This class is used to build up a contiguous binary blob while keeping
37// track of an offset in the output (which notionally begins at
38// `InitialOffset`).
39// The blob might be limited to an arbitrary size. All attempts to write data
40// are ignored and the error condition is remembered once the limit is reached.
41// Such an approach allows us to simplify the code by delaying error reporting
42// and doing it at a convenient time.
43namespace {
44class ContiguousBlobAccumulator {
45 const uint64_t InitialOffset;
46 const uint64_t MaxSize;
47
49 raw_svector_ostream OS;
50 Error ReachedLimitErr = Error::success();
51
52 bool checkLimit(uint64_t Size) {
53 if (!ReachedLimitErr && getOffset() + Size <= MaxSize)
54 return true;
55 if (!ReachedLimitErr)
56 ReachedLimitErr = createStringError(errc::invalid_argument,
57 "reached the output size limit");
58 return false;
59 }
60
61public:
62 ContiguousBlobAccumulator(uint64_t BaseOffset, uint64_t SizeLimit)
63 : InitialOffset(BaseOffset), MaxSize(SizeLimit), OS(Buf) {}
64
65 uint64_t tell() const { return OS.tell(); }
66 uint64_t getOffset() const { return InitialOffset + OS.tell(); }
67 void writeBlobToStream(raw_ostream &Out) const { Out << OS.str(); }
68
69 Error takeLimitError() {
70 // Request to write 0 bytes to check we did not reach the limit.
71 checkLimit(0);
72 return std::move(ReachedLimitErr);
73 }
74
75 /// \returns The new offset.
76 uint64_t padToAlignment(unsigned Align) {
77 uint64_t CurrentOffset = getOffset();
78 if (ReachedLimitErr)
79 return CurrentOffset;
80
81 uint64_t AlignedOffset = alignTo(CurrentOffset, Align == 0 ? 1 : Align);
82 uint64_t PaddingSize = AlignedOffset - CurrentOffset;
83 if (!checkLimit(PaddingSize))
84 return CurrentOffset;
85
86 writeZeros(PaddingSize);
87 return AlignedOffset;
88 }
89
90 raw_ostream *getRawOS(uint64_t Size) {
91 if (checkLimit(Size))
92 return &OS;
93 return nullptr;
94 }
95
96 void writeAsBinary(const yaml::BinaryRef &Bin, uint64_t N = UINT64_MAX) {
97 if (!checkLimit(Bin.binary_size()))
98 return;
99 Bin.writeAsBinary(OS, N);
100 }
101
102 void writeZeros(uint64_t Num) {
103 if (checkLimit(Num))
104 OS.write_zeros(Num);
105 }
106
107 void write(const char *Ptr, size_t Size) {
108 if (checkLimit(Size))
109 OS.write(Ptr, Size);
110 }
111
112 void write(unsigned char C) {
113 if (checkLimit(1))
114 OS.write(C);
115 }
116
117 unsigned writeULEB128(uint64_t Val) {
118 if (!checkLimit(sizeof(uint64_t)))
119 return 0;
120 return encodeULEB128(Val, OS);
121 }
122
123 unsigned writeSLEB128(int64_t Val) {
124 if (!checkLimit(10))
125 return 0;
126 return encodeSLEB128(Val, OS);
127 }
128
129 template <typename T> void write(T Val, llvm::endianness E) {
130 if (checkLimit(sizeof(T)))
132 }
133
134 void updateDataAt(uint64_t Pos, void *Data, size_t Size) {
135 assert(Pos >= InitialOffset && Pos + Size <= getOffset());
136 memcpy(&Buf[Pos - InitialOffset], Data, Size);
137 }
138};
139
140// Used to keep track of section and symbol names, so that in the YAML file
141// sections and symbols can be referenced by name instead of by index.
142class NameToIdxMap {
143 StringMap<unsigned> Map;
144
145public:
146 /// \Returns false if name is already present in the map.
147 bool addName(StringRef Name, unsigned Ndx) {
148 return Map.insert({Name, Ndx}).second;
149 }
150 /// \Returns false if name is not present in the map.
151 bool lookup(StringRef Name, unsigned &Idx) const {
152 auto I = Map.find(Name);
153 if (I == Map.end())
154 return false;
155 Idx = I->getValue();
156 return true;
157 }
158 /// Asserts if name is not present in the map.
159 unsigned get(StringRef Name) const {
160 unsigned Idx;
161 if (lookup(Name, Idx))
162 return Idx;
163 assert(false && "Expected section not found in index");
164 return 0;
165 }
166 unsigned size() const { return Map.size(); }
167};
168
169namespace {
170struct Fragment {
171 uint64_t Offset;
172 uint64_t Size;
173 uint32_t Type;
174 uint64_t AddrAlign;
175};
176} // namespace
177
178/// "Single point of truth" for the ELF file construction.
179/// TODO: This class still has a ways to go before it is truly a "single
180/// point of truth".
181template <class ELFT> class ELFState {
183
184 enum class SymtabType { Static, Dynamic };
185
186 /// The future symbol table string section.
187 StringTableBuilder DotStrtab{StringTableBuilder::ELF};
188
189 /// The future section header string table section, if a unique string table
190 /// is needed. Don't reference this variable direectly: use the
191 /// ShStrtabStrings member instead.
192 StringTableBuilder DotShStrtab{StringTableBuilder::ELF};
193
194 /// The future dynamic symbol string section.
195 StringTableBuilder DotDynstr{StringTableBuilder::ELF};
196
197 /// The name of the section header string table section. If it is .strtab or
198 /// .dynstr, the section header strings will be written to the same string
199 /// table as the static/dynamic symbols respectively. Otherwise a dedicated
200 /// section will be created with that name.
201 StringRef SectionHeaderStringTableName = ".shstrtab";
202 StringTableBuilder *ShStrtabStrings = &DotShStrtab;
203
204 NameToIdxMap SN2I;
205 NameToIdxMap SymN2I;
206 NameToIdxMap DynSymN2I;
207 ELFYAML::Object &Doc;
208
209 std::vector<std::pair<Elf_Shdr *, ELFYAML::Section>>
210 SectionHeadersOverrideHelper;
211
212 StringSet<> ExcludedSectionHeaders;
213
214 uint64_t LocationCounter = 0;
215 bool HasError = false;
216 yaml::ErrorHandler ErrHandler;
217 void reportError(const Twine &Msg);
218 void reportError(Error Err);
219
220 std::vector<Elf_Sym> toELFSymbols(ArrayRef<ELFYAML::Symbol> Symbols,
221 const StringTableBuilder &Strtab);
222 unsigned toSectionIndex(StringRef S, StringRef LocSec, StringRef LocSym = "");
223 unsigned toSymbolIndex(StringRef S, StringRef LocSec, bool IsDynamic);
224
225 void buildSectionIndex();
226 void buildSymbolIndexes();
227 void initProgramHeaders(std::vector<Elf_Phdr> &PHeaders);
228 bool initImplicitHeader(ContiguousBlobAccumulator &CBA, Elf_Shdr &Header,
229 StringRef SecName, ELFYAML::Section *YAMLSec);
230 void initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
231 ContiguousBlobAccumulator &CBA);
232 void overrideSectionHeaders(std::vector<Elf_Shdr> &SHeaders);
233 void initSymtabSectionHeader(Elf_Shdr &SHeader, SymtabType STType,
234 ContiguousBlobAccumulator &CBA,
235 ELFYAML::Section *YAMLSec);
236 void initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name,
237 StringTableBuilder &STB,
238 ContiguousBlobAccumulator &CBA,
239 ELFYAML::Section *YAMLSec);
240 void initDWARFSectionHeader(Elf_Shdr &SHeader, StringRef Name,
241 ContiguousBlobAccumulator &CBA,
242 ELFYAML::Section *YAMLSec);
243 void setProgramHeaderLayout(std::vector<Elf_Phdr> &PHeaders,
244 std::vector<Elf_Shdr> &SHeaders);
245
246 std::vector<Fragment>
247 getPhdrFragments(const ELFYAML::ProgramHeader &Phdr,
249
250 void finalizeStrings();
251 void writeELFHeader(raw_ostream &OS);
252 void writeSectionContent(Elf_Shdr &SHeader,
253 const ELFYAML::NoBitsSection &Section,
254 ContiguousBlobAccumulator &CBA);
255 void writeSectionContent(Elf_Shdr &SHeader,
256 const ELFYAML::RawContentSection &Section,
257 ContiguousBlobAccumulator &CBA);
258 void writeSectionContent(Elf_Shdr &SHeader,
259 const ELFYAML::RelocationSection &Section,
260 ContiguousBlobAccumulator &CBA);
261 void writeSectionContent(Elf_Shdr &SHeader,
262 const ELFYAML::RelrSection &Section,
263 ContiguousBlobAccumulator &CBA);
264 void writeSectionContent(Elf_Shdr &SHeader,
265 const ELFYAML::GroupSection &Group,
266 ContiguousBlobAccumulator &CBA);
267 void writeSectionContent(Elf_Shdr &SHeader,
268 const ELFYAML::SymtabShndxSection &Shndx,
269 ContiguousBlobAccumulator &CBA);
270 void writeSectionContent(Elf_Shdr &SHeader,
271 const ELFYAML::SymverSection &Section,
272 ContiguousBlobAccumulator &CBA);
273 void writeSectionContent(Elf_Shdr &SHeader,
274 const ELFYAML::VerneedSection &Section,
275 ContiguousBlobAccumulator &CBA);
276 void writeSectionContent(Elf_Shdr &SHeader,
277 const ELFYAML::VerdefSection &Section,
278 ContiguousBlobAccumulator &CBA);
279 void writeSectionContent(Elf_Shdr &SHeader,
280 const ELFYAML::ARMIndexTableSection &Section,
281 ContiguousBlobAccumulator &CBA);
282 void writeSectionContent(Elf_Shdr &SHeader,
283 const ELFYAML::MipsABIFlags &Section,
284 ContiguousBlobAccumulator &CBA);
285 void writeSectionContent(Elf_Shdr &SHeader,
286 const ELFYAML::DynamicSection &Section,
287 ContiguousBlobAccumulator &CBA);
288 void writeSectionContent(Elf_Shdr &SHeader,
289 const ELFYAML::StackSizesSection &Section,
290 ContiguousBlobAccumulator &CBA);
291 void writeSectionContent(Elf_Shdr &SHeader,
292 const ELFYAML::BBAddrMapSection &Section,
293 ContiguousBlobAccumulator &CBA);
294 void writeSectionContent(Elf_Shdr &SHeader,
295 const ELFYAML::HashSection &Section,
296 ContiguousBlobAccumulator &CBA);
297 void writeSectionContent(Elf_Shdr &SHeader,
298 const ELFYAML::AddrsigSection &Section,
299 ContiguousBlobAccumulator &CBA);
300 void writeSectionContent(Elf_Shdr &SHeader,
301 const ELFYAML::NoteSection &Section,
302 ContiguousBlobAccumulator &CBA);
303 void writeSectionContent(Elf_Shdr &SHeader,
304 const ELFYAML::GnuHashSection &Section,
305 ContiguousBlobAccumulator &CBA);
306 void writeSectionContent(Elf_Shdr &SHeader,
307 const ELFYAML::LinkerOptionsSection &Section,
308 ContiguousBlobAccumulator &CBA);
309 void writeSectionContent(Elf_Shdr &SHeader,
310 const ELFYAML::DependentLibrariesSection &Section,
311 ContiguousBlobAccumulator &CBA);
312 void writeSectionContent(Elf_Shdr &SHeader,
313 const ELFYAML::CallGraphProfileSection &Section,
314 ContiguousBlobAccumulator &CBA);
315
316 void writeFill(ELFYAML::Fill &Fill, ContiguousBlobAccumulator &CBA);
317
318 ELFState(ELFYAML::Object &D, yaml::ErrorHandler EH);
319
320 void assignSectionAddress(Elf_Shdr &SHeader, ELFYAML::Section *YAMLSec);
321
322 DenseMap<StringRef, size_t> buildSectionHeaderReorderMap();
323
324 BumpPtrAllocator StringAlloc;
325 uint64_t alignToOffset(ContiguousBlobAccumulator &CBA, uint64_t Align,
326 std::optional<llvm::yaml::Hex64> Offset);
327
328 uint64_t getSectionNameOffset(StringRef Name);
329
330public:
331 static bool writeELF(raw_ostream &OS, ELFYAML::Object &Doc,
332 yaml::ErrorHandler EH, uint64_t MaxSize);
333};
334} // end anonymous namespace
335
336template <class T> static size_t arrayDataSize(ArrayRef<T> A) {
337 return A.size() * sizeof(T);
338}
339
340template <class T> static void writeArrayData(raw_ostream &OS, ArrayRef<T> A) {
341 OS.write((const char *)A.data(), arrayDataSize(A));
342}
343
344template <class T> static void zero(T &Obj) { memset(&Obj, 0, sizeof(Obj)); }
345
346template <class ELFT>
347ELFState<ELFT>::ELFState(ELFYAML::Object &D, yaml::ErrorHandler EH)
348 : Doc(D), ErrHandler(EH) {
349 // The input may explicitly request to store the section header table strings
350 // in the same string table as dynamic or static symbol names. Set the
351 // ShStrtabStrings member accordingly.
352 if (Doc.Header.SectionHeaderStringTable) {
353 SectionHeaderStringTableName = *Doc.Header.SectionHeaderStringTable;
354 if (*Doc.Header.SectionHeaderStringTable == ".strtab")
355 ShStrtabStrings = &DotStrtab;
356 else if (*Doc.Header.SectionHeaderStringTable == ".dynstr")
357 ShStrtabStrings = &DotDynstr;
358 // Otherwise, the unique table will be used.
359 }
360
361 std::vector<ELFYAML::Section *> Sections = Doc.getSections();
362 // Insert SHT_NULL section implicitly when it is not defined in YAML.
363 if (Sections.empty() || Sections.front()->Type != ELF::SHT_NULL)
364 Doc.Chunks.insert(
365 Doc.Chunks.begin(),
366 std::make_unique<ELFYAML::Section>(
367 ELFYAML::Chunk::ChunkKind::RawContent, /*IsImplicit=*/true));
368
369 StringSet<> DocSections;
370 ELFYAML::SectionHeaderTable *SecHdrTable = nullptr;
371 for (size_t I = 0; I < Doc.Chunks.size(); ++I) {
372 const std::unique_ptr<ELFYAML::Chunk> &C = Doc.Chunks[I];
373
374 // We might have an explicit section header table declaration.
375 if (auto S = dyn_cast<ELFYAML::SectionHeaderTable>(C.get())) {
376 if (SecHdrTable)
377 reportError("multiple section header tables are not allowed");
378 SecHdrTable = S;
379 continue;
380 }
381
382 // We add a technical suffix for each unnamed section/fill. It does not
383 // affect the output, but allows us to map them by name in the code and
384 // report better error messages.
385 if (C->Name.empty()) {
386 std::string NewName = ELFYAML::appendUniqueSuffix(
387 /*Name=*/"", "index " + Twine(I));
388 C->Name = StringRef(NewName).copy(StringAlloc);
389 assert(ELFYAML::dropUniqueSuffix(C->Name).empty());
390 }
391
392 if (!DocSections.insert(C->Name).second)
393 reportError("repeated section/fill name: '" + C->Name +
394 "' at YAML section/fill number " + Twine(I));
395 }
396
397 SmallSetVector<StringRef, 8> ImplicitSections;
398 if (Doc.DynamicSymbols) {
399 if (SectionHeaderStringTableName == ".dynsym")
400 reportError("cannot use '.dynsym' as the section header name table when "
401 "there are dynamic symbols");
402 ImplicitSections.insert(".dynsym");
403 ImplicitSections.insert(".dynstr");
404 }
405 if (Doc.Symbols) {
406 if (SectionHeaderStringTableName == ".symtab")
407 reportError("cannot use '.symtab' as the section header name table when "
408 "there are symbols");
409 ImplicitSections.insert(".symtab");
410 }
411 if (Doc.DWARF)
412 for (StringRef DebugSecName : Doc.DWARF->getNonEmptySectionNames()) {
413 std::string SecName = ("." + DebugSecName).str();
414 // TODO: For .debug_str it should be possible to share the string table,
415 // in the same manner as the symbol string tables.
416 if (SectionHeaderStringTableName == SecName)
417 reportError("cannot use '" + SecName +
418 "' as the section header name table when it is needed for "
419 "DWARF output");
420 ImplicitSections.insert(StringRef(SecName).copy(StringAlloc));
421 }
422 // TODO: Only create the .strtab here if any symbols have been requested.
423 ImplicitSections.insert(".strtab");
424 if (!SecHdrTable || !SecHdrTable->NoHeaders.value_or(false))
425 ImplicitSections.insert(SectionHeaderStringTableName);
426
427 // Insert placeholders for implicit sections that are not
428 // defined explicitly in YAML.
429 for (StringRef SecName : ImplicitSections) {
430 if (DocSections.count(SecName))
431 continue;
432
433 std::unique_ptr<ELFYAML::Section> Sec = std::make_unique<ELFYAML::Section>(
434 ELFYAML::Chunk::ChunkKind::RawContent, true /*IsImplicit*/);
435 Sec->Name = SecName;
436
437 if (SecName == SectionHeaderStringTableName)
438 Sec->Type = ELF::SHT_STRTAB;
439 else if (SecName == ".dynsym")
440 Sec->Type = ELF::SHT_DYNSYM;
441 else if (SecName == ".symtab")
442 Sec->Type = ELF::SHT_SYMTAB;
443 else
444 Sec->Type = ELF::SHT_STRTAB;
445
446 // When the section header table is explicitly defined at the end of the
447 // sections list, it is reasonable to assume that the user wants to reorder
448 // section headers, but still wants to place the section header table after
449 // all sections, like it normally happens. In this case we want to insert
450 // other implicit sections right before the section header table.
451 if (Doc.Chunks.back().get() == SecHdrTable)
452 Doc.Chunks.insert(Doc.Chunks.end() - 1, std::move(Sec));
453 else
454 Doc.Chunks.push_back(std::move(Sec));
455 }
456
457 // Insert the section header table implicitly at the end, when it is not
458 // explicitly defined.
459 if (!SecHdrTable)
460 Doc.Chunks.push_back(
461 std::make_unique<ELFYAML::SectionHeaderTable>(/*IsImplicit=*/true));
462}
463
464template <class ELFT>
465void ELFState<ELFT>::writeELFHeader(raw_ostream &OS) {
466 using namespace llvm::ELF;
467
468 Elf_Ehdr Header;
469 zero(Header);
470 Header.e_ident[EI_MAG0] = 0x7f;
471 Header.e_ident[EI_MAG1] = 'E';
472 Header.e_ident[EI_MAG2] = 'L';
473 Header.e_ident[EI_MAG3] = 'F';
474 Header.e_ident[EI_CLASS] = ELFT::Is64Bits ? ELFCLASS64 : ELFCLASS32;
475 Header.e_ident[EI_DATA] = Doc.Header.Data;
476 Header.e_ident[EI_VERSION] = EV_CURRENT;
477 Header.e_ident[EI_OSABI] = Doc.Header.OSABI;
478 Header.e_ident[EI_ABIVERSION] = Doc.Header.ABIVersion;
479 Header.e_type = Doc.Header.Type;
480
481 if (Doc.Header.Machine)
482 Header.e_machine = *Doc.Header.Machine;
483 else
484 Header.e_machine = EM_NONE;
485
486 Header.e_version = EV_CURRENT;
487 Header.e_entry = Doc.Header.Entry;
488 if (Doc.Header.Flags)
489 Header.e_flags = *Doc.Header.Flags;
490 else
491 Header.e_flags = 0;
492
493 Header.e_ehsize = sizeof(Elf_Ehdr);
494
495 if (Doc.Header.EPhOff)
496 Header.e_phoff = *Doc.Header.EPhOff;
497 else if (!Doc.ProgramHeaders.empty())
498 Header.e_phoff = sizeof(Header);
499 else
500 Header.e_phoff = 0;
501
502 if (Doc.Header.EPhEntSize)
503 Header.e_phentsize = *Doc.Header.EPhEntSize;
504 else if (!Doc.ProgramHeaders.empty())
505 Header.e_phentsize = sizeof(Elf_Phdr);
506 else
507 Header.e_phentsize = 0;
508
509 if (Doc.Header.EPhNum)
510 Header.e_phnum = *Doc.Header.EPhNum;
511 else if (!Doc.ProgramHeaders.empty())
512 Header.e_phnum = Doc.ProgramHeaders.size();
513 else
514 Header.e_phnum = 0;
515
516 Header.e_shentsize = Doc.Header.EShEntSize ? (uint16_t)*Doc.Header.EShEntSize
517 : sizeof(Elf_Shdr);
518
519 const ELFYAML::SectionHeaderTable &SectionHeaders =
520 Doc.getSectionHeaderTable();
521
522 if (Doc.Header.EShOff)
523 Header.e_shoff = *Doc.Header.EShOff;
524 else if (SectionHeaders.Offset)
525 Header.e_shoff = *SectionHeaders.Offset;
526 else
527 Header.e_shoff = 0;
528
529 if (Doc.Header.EShNum)
530 Header.e_shnum = *Doc.Header.EShNum;
531 else
532 Header.e_shnum = SectionHeaders.getNumHeaders(Doc.getSections().size());
533
534 if (Doc.Header.EShStrNdx)
535 Header.e_shstrndx = *Doc.Header.EShStrNdx;
536 else if (SectionHeaders.Offset &&
537 !ExcludedSectionHeaders.count(SectionHeaderStringTableName))
538 Header.e_shstrndx = SN2I.get(SectionHeaderStringTableName);
539 else
540 Header.e_shstrndx = 0;
541
542 OS.write((const char *)&Header, sizeof(Header));
543}
544
545template <class ELFT>
546void ELFState<ELFT>::initProgramHeaders(std::vector<Elf_Phdr> &PHeaders) {
547 DenseMap<StringRef, size_t> NameToIndex;
548 for (size_t I = 0, E = Doc.Chunks.size(); I != E; ++I) {
549 NameToIndex[Doc.Chunks[I]->Name] = I + 1;
550 }
551
552 for (size_t I = 0, E = Doc.ProgramHeaders.size(); I != E; ++I) {
553 ELFYAML::ProgramHeader &YamlPhdr = Doc.ProgramHeaders[I];
554 Elf_Phdr Phdr;
555 zero(Phdr);
556 Phdr.p_type = YamlPhdr.Type;
557 Phdr.p_flags = YamlPhdr.Flags;
558 Phdr.p_vaddr = YamlPhdr.VAddr;
559 Phdr.p_paddr = YamlPhdr.PAddr;
560 PHeaders.push_back(Phdr);
561
562 if (!YamlPhdr.FirstSec && !YamlPhdr.LastSec)
563 continue;
564
565 // Get the index of the section, or 0 in the case when the section doesn't exist.
566 size_t First = NameToIndex[*YamlPhdr.FirstSec];
567 if (!First)
568 reportError("unknown section or fill referenced: '" + *YamlPhdr.FirstSec +
569 "' by the 'FirstSec' key of the program header with index " +
570 Twine(I));
571 size_t Last = NameToIndex[*YamlPhdr.LastSec];
572 if (!Last)
573 reportError("unknown section or fill referenced: '" + *YamlPhdr.LastSec +
574 "' by the 'LastSec' key of the program header with index " +
575 Twine(I));
576 if (!First || !Last)
577 continue;
578
579 if (First > Last)
580 reportError("program header with index " + Twine(I) +
581 ": the section index of " + *YamlPhdr.FirstSec +
582 " is greater than the index of " + *YamlPhdr.LastSec);
583
584 for (size_t I = First; I <= Last; ++I)
585 YamlPhdr.Chunks.push_back(Doc.Chunks[I - 1].get());
586 }
587}
588
589template <class ELFT>
590unsigned ELFState<ELFT>::toSectionIndex(StringRef S, StringRef LocSec,
591 StringRef LocSym) {
592 assert(LocSec.empty() || LocSym.empty());
593
594 unsigned Index;
595 if (!SN2I.lookup(S, Index) && !to_integer(S, Index)) {
596 if (!LocSym.empty())
597 reportError("unknown section referenced: '" + S + "' by YAML symbol '" +
598 LocSym + "'");
599 else
600 reportError("unknown section referenced: '" + S + "' by YAML section '" +
601 LocSec + "'");
602 return 0;
603 }
604
605 const ELFYAML::SectionHeaderTable &SectionHeaders =
606 Doc.getSectionHeaderTable();
607 if (SectionHeaders.IsImplicit ||
608 (SectionHeaders.NoHeaders && !*SectionHeaders.NoHeaders) ||
609 SectionHeaders.isDefault())
610 return Index;
611
612 assert(!SectionHeaders.NoHeaders.value_or(false) || !SectionHeaders.Sections);
613 size_t FirstExcluded =
614 SectionHeaders.Sections ? SectionHeaders.Sections->size() : 0;
615 if (Index > FirstExcluded) {
616 if (LocSym.empty())
617 reportError("unable to link '" + LocSec + "' to excluded section '" + S +
618 "'");
619 else
620 reportError("excluded section referenced: '" + S + "' by symbol '" +
621 LocSym + "'");
622 }
623 return Index;
624}
625
626template <class ELFT>
627unsigned ELFState<ELFT>::toSymbolIndex(StringRef S, StringRef LocSec,
628 bool IsDynamic) {
629 const NameToIdxMap &SymMap = IsDynamic ? DynSymN2I : SymN2I;
630 unsigned Index;
631 // Here we try to look up S in the symbol table. If it is not there,
632 // treat its value as a symbol index.
633 if (!SymMap.lookup(S, Index) && !to_integer(S, Index)) {
634 reportError("unknown symbol referenced: '" + S + "' by YAML section '" +
635 LocSec + "'");
636 return 0;
637 }
638 return Index;
639}
640
641template <class ELFT>
642static void overrideFields(ELFYAML::Section *From, typename ELFT::Shdr &To) {
643 if (!From)
644 return;
645 if (From->ShAddrAlign)
646 To.sh_addralign = *From->ShAddrAlign;
647 if (From->ShFlags)
648 To.sh_flags = *From->ShFlags;
649 if (From->ShName)
650 To.sh_name = *From->ShName;
651 if (From->ShOffset)
652 To.sh_offset = *From->ShOffset;
653 if (From->ShSize)
654 To.sh_size = *From->ShSize;
655 if (From->ShType)
656 To.sh_type = *From->ShType;
657}
658
659template <class ELFT>
660bool ELFState<ELFT>::initImplicitHeader(ContiguousBlobAccumulator &CBA,
661 Elf_Shdr &Header, StringRef SecName,
662 ELFYAML::Section *YAMLSec) {
663 // Check if the header was already initialized.
664 if (Header.sh_offset)
665 return false;
666
667 if (SecName == ".strtab")
668 initStrtabSectionHeader(Header, SecName, DotStrtab, CBA, YAMLSec);
669 else if (SecName == ".dynstr")
670 initStrtabSectionHeader(Header, SecName, DotDynstr, CBA, YAMLSec);
671 else if (SecName == SectionHeaderStringTableName)
672 initStrtabSectionHeader(Header, SecName, *ShStrtabStrings, CBA, YAMLSec);
673 else if (SecName == ".symtab")
674 initSymtabSectionHeader(Header, SymtabType::Static, CBA, YAMLSec);
675 else if (SecName == ".dynsym")
676 initSymtabSectionHeader(Header, SymtabType::Dynamic, CBA, YAMLSec);
677 else if (SecName.starts_with(".debug_")) {
678 // If a ".debug_*" section's type is a preserved one, e.g., SHT_DYNAMIC, we
679 // will not treat it as a debug section.
680 if (YAMLSec && !isa<ELFYAML::RawContentSection>(YAMLSec))
681 return false;
682 initDWARFSectionHeader(Header, SecName, CBA, YAMLSec);
683 } else
684 return false;
685
686 LocationCounter += Header.sh_size;
687
688 // Override section fields if requested.
689 overrideFields<ELFT>(YAMLSec, Header);
690 return true;
691}
692
693constexpr char SuffixStart = '(';
694constexpr char SuffixEnd = ')';
695
697 const Twine &Msg) {
698 // Do not add a space when a Name is empty.
699 std::string Ret = Name.empty() ? "" : Name.str() + ' ';
700 return Ret + (Twine(SuffixStart) + Msg + Twine(SuffixEnd)).str();
701}
702
704 if (S.empty() || S.back() != SuffixEnd)
705 return S;
706
707 // A special case for empty names. See appendUniqueSuffix() above.
708 size_t SuffixPos = S.rfind(SuffixStart);
709 if (SuffixPos == 0)
710 return "";
711
712 if (SuffixPos == StringRef::npos || S[SuffixPos - 1] != ' ')
713 return S;
714 return S.substr(0, SuffixPos - 1);
715}
716
717template <class ELFT>
718uint64_t ELFState<ELFT>::getSectionNameOffset(StringRef Name) {
719 // If a section is excluded from section headers, we do not save its name in
720 // the string table.
721 if (ExcludedSectionHeaders.count(Name))
722 return 0;
723 return ShStrtabStrings->getOffset(Name);
724}
725
726static uint64_t writeContent(ContiguousBlobAccumulator &CBA,
727 const std::optional<yaml::BinaryRef> &Content,
728 const std::optional<llvm::yaml::Hex64> &Size) {
729 size_t ContentSize = 0;
730 if (Content) {
731 CBA.writeAsBinary(*Content);
732 ContentSize = Content->binary_size();
733 }
734
735 if (!Size)
736 return ContentSize;
737
738 CBA.writeZeros(*Size - ContentSize);
739 return *Size;
740}
741
743 switch (SecType) {
744 case ELF::SHT_REL:
745 case ELF::SHT_RELA:
746 case ELF::SHT_GROUP:
749 return ".symtab";
751 case ELF::SHT_HASH:
753 return ".dynsym";
754 case ELF::SHT_DYNSYM:
757 return ".dynstr";
758 case ELF::SHT_SYMTAB:
759 return ".strtab";
760 default:
761 return "";
762 }
763}
764
765template <class ELFT>
766void ELFState<ELFT>::initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
767 ContiguousBlobAccumulator &CBA) {
768 // Ensure SHN_UNDEF entry is present. An all-zero section header is a
769 // valid SHN_UNDEF entry since SHT_NULL == 0.
770 SHeaders.resize(Doc.getSections().size());
771
772 for (const std::unique_ptr<ELFYAML::Chunk> &D : Doc.Chunks) {
773 if (ELFYAML::Fill *S = dyn_cast<ELFYAML::Fill>(D.get())) {
774 S->Offset = alignToOffset(CBA, /*Align=*/1, S->Offset);
775 writeFill(*S, CBA);
776 LocationCounter += S->Size;
777 continue;
778 }
779
782 if (S->NoHeaders.value_or(false))
783 continue;
784
785 if (!S->Offset)
786 S->Offset = alignToOffset(CBA, sizeof(typename ELFT::uint),
787 /*Offset=*/std::nullopt);
788 else
789 S->Offset = alignToOffset(CBA, /*Align=*/1, S->Offset);
790
791 uint64_t Size = S->getNumHeaders(SHeaders.size()) * sizeof(Elf_Shdr);
792 // The full section header information might be not available here, so
793 // fill the space with zeroes as a placeholder.
794 CBA.writeZeros(Size);
795 LocationCounter += Size;
796 continue;
797 }
798
800 bool IsFirstUndefSection = Sec == Doc.getSections().front();
801 if (IsFirstUndefSection && Sec->IsImplicit)
802 continue;
803
804 Elf_Shdr &SHeader = SHeaders[SN2I.get(Sec->Name)];
805 if (Sec->Link) {
806 SHeader.sh_link = toSectionIndex(*Sec->Link, Sec->Name);
807 } else {
808 StringRef LinkSec = getDefaultLinkSec(Sec->Type);
809 unsigned Link = 0;
810 if (!LinkSec.empty() && !ExcludedSectionHeaders.count(LinkSec) &&
811 SN2I.lookup(LinkSec, Link))
812 SHeader.sh_link = Link;
813 }
814
815 if (Sec->EntSize)
816 SHeader.sh_entsize = *Sec->EntSize;
817 else
818 SHeader.sh_entsize = ELFYAML::getDefaultShEntSize<ELFT>(
819 Doc.Header.Machine.value_or(ELF::EM_NONE), Sec->Type, Sec->Name);
820
821 // We have a few sections like string or symbol tables that are usually
822 // added implicitly to the end. However, if they are explicitly specified
823 // in the YAML, we need to write them here. This ensures the file offset
824 // remains correct.
825 if (initImplicitHeader(CBA, SHeader, Sec->Name,
826 Sec->IsImplicit ? nullptr : Sec))
827 continue;
828
829 assert(Sec && "It can't be null unless it is an implicit section. But all "
830 "implicit sections should already have been handled above.");
831
832 SHeader.sh_name =
833 getSectionNameOffset(ELFYAML::dropUniqueSuffix(Sec->Name));
834 SHeader.sh_type = Sec->Type;
835 if (Sec->Flags)
836 SHeader.sh_flags = *Sec->Flags;
837 SHeader.sh_addralign = Sec->AddressAlign;
838
839 // Set the offset for all sections, except the SHN_UNDEF section with index
840 // 0 when not explicitly requested.
841 if (!IsFirstUndefSection || Sec->Offset)
842 SHeader.sh_offset = alignToOffset(CBA, SHeader.sh_addralign, Sec->Offset);
843
844 assignSectionAddress(SHeader, Sec);
845
846 if (IsFirstUndefSection) {
847 if (auto RawSec = dyn_cast<ELFYAML::RawContentSection>(Sec)) {
848 // We do not write any content for special SHN_UNDEF section.
849 if (RawSec->Size)
850 SHeader.sh_size = *RawSec->Size;
851 if (RawSec->Info)
852 SHeader.sh_info = *RawSec->Info;
853 }
854
855 LocationCounter += SHeader.sh_size;
856 SectionHeadersOverrideHelper.push_back({&SHeader, *Sec});
857 continue;
858 }
859
860 if (!isa<ELFYAML::NoBitsSection>(Sec) && (Sec->Content || Sec->Size))
861 SHeader.sh_size = writeContent(CBA, Sec->Content, Sec->Size);
862
863 if (auto S = dyn_cast<ELFYAML::RawContentSection>(Sec)) {
864 writeSectionContent(SHeader, *S, CBA);
865 } else if (auto S = dyn_cast<ELFYAML::SymtabShndxSection>(Sec)) {
866 writeSectionContent(SHeader, *S, CBA);
867 } else if (auto S = dyn_cast<ELFYAML::RelocationSection>(Sec)) {
868 writeSectionContent(SHeader, *S, CBA);
869 } else if (auto S = dyn_cast<ELFYAML::RelrSection>(Sec)) {
870 writeSectionContent(SHeader, *S, CBA);
871 } else if (auto S = dyn_cast<ELFYAML::GroupSection>(Sec)) {
872 writeSectionContent(SHeader, *S, CBA);
873 } else if (auto S = dyn_cast<ELFYAML::ARMIndexTableSection>(Sec)) {
874 writeSectionContent(SHeader, *S, CBA);
875 } else if (auto S = dyn_cast<ELFYAML::MipsABIFlags>(Sec)) {
876 writeSectionContent(SHeader, *S, CBA);
877 } else if (auto S = dyn_cast<ELFYAML::NoBitsSection>(Sec)) {
878 writeSectionContent(SHeader, *S, CBA);
879 } else if (auto S = dyn_cast<ELFYAML::DynamicSection>(Sec)) {
880 writeSectionContent(SHeader, *S, CBA);
881 } else if (auto S = dyn_cast<ELFYAML::SymverSection>(Sec)) {
882 writeSectionContent(SHeader, *S, CBA);
883 } else if (auto S = dyn_cast<ELFYAML::VerneedSection>(Sec)) {
884 writeSectionContent(SHeader, *S, CBA);
885 } else if (auto S = dyn_cast<ELFYAML::VerdefSection>(Sec)) {
886 writeSectionContent(SHeader, *S, CBA);
887 } else if (auto S = dyn_cast<ELFYAML::StackSizesSection>(Sec)) {
888 writeSectionContent(SHeader, *S, CBA);
889 } else if (auto S = dyn_cast<ELFYAML::HashSection>(Sec)) {
890 writeSectionContent(SHeader, *S, CBA);
891 } else if (auto S = dyn_cast<ELFYAML::AddrsigSection>(Sec)) {
892 writeSectionContent(SHeader, *S, CBA);
893 } else if (auto S = dyn_cast<ELFYAML::LinkerOptionsSection>(Sec)) {
894 writeSectionContent(SHeader, *S, CBA);
895 } else if (auto S = dyn_cast<ELFYAML::NoteSection>(Sec)) {
896 writeSectionContent(SHeader, *S, CBA);
897 } else if (auto S = dyn_cast<ELFYAML::GnuHashSection>(Sec)) {
898 writeSectionContent(SHeader, *S, CBA);
899 } else if (auto S = dyn_cast<ELFYAML::DependentLibrariesSection>(Sec)) {
900 writeSectionContent(SHeader, *S, CBA);
901 } else if (auto S = dyn_cast<ELFYAML::CallGraphProfileSection>(Sec)) {
902 writeSectionContent(SHeader, *S, CBA);
903 } else if (auto S = dyn_cast<ELFYAML::BBAddrMapSection>(Sec)) {
904 writeSectionContent(SHeader, *S, CBA);
905 } else {
906 llvm_unreachable("Unknown section type");
907 }
908
909 LocationCounter += SHeader.sh_size;
910 SectionHeadersOverrideHelper.push_back({&SHeader, *Sec});
911 }
912}
913
914template <class ELFT>
915void ELFState<ELFT>::overrideSectionHeaders(std::vector<Elf_Shdr> &SHeaders) {
916 for (std::pair<Elf_Shdr *, ELFYAML::Section> &HeaderAndSec :
917 SectionHeadersOverrideHelper)
918 overrideFields<ELFT>(&HeaderAndSec.second, *HeaderAndSec.first);
919}
920
921template <class ELFT>
922void ELFState<ELFT>::assignSectionAddress(Elf_Shdr &SHeader,
923 ELFYAML::Section *YAMLSec) {
924 if (YAMLSec && YAMLSec->Address) {
925 SHeader.sh_addr = *YAMLSec->Address;
926 LocationCounter = *YAMLSec->Address;
927 return;
928 }
929
930 // sh_addr represents the address in the memory image of a process. Sections
931 // in a relocatable object file or non-allocatable sections do not need
932 // sh_addr assignment.
933 if (Doc.Header.Type.value == ELF::ET_REL ||
934 !(SHeader.sh_flags & ELF::SHF_ALLOC))
935 return;
936
937 LocationCounter =
938 alignTo(LocationCounter, SHeader.sh_addralign ? SHeader.sh_addralign : 1);
939 SHeader.sh_addr = LocationCounter;
940}
941
943 for (size_t I = 0; I < Symbols.size(); ++I)
944 if (Symbols[I].Binding.value != ELF::STB_LOCAL)
945 return I;
946 return Symbols.size();
947}
948
949template <class ELFT>
950std::vector<typename ELFT::Sym>
951ELFState<ELFT>::toELFSymbols(ArrayRef<ELFYAML::Symbol> Symbols,
952 const StringTableBuilder &Strtab) {
953 std::vector<Elf_Sym> Ret;
954 Ret.resize(Symbols.size() + 1);
955
956 size_t I = 0;
957 for (const ELFYAML::Symbol &Sym : Symbols) {
958 Elf_Sym &Symbol = Ret[++I];
959
960 // If NameIndex, which contains the name offset, is explicitly specified, we
961 // use it. This is useful for preparing broken objects. Otherwise, we add
962 // the specified Name to the string table builder to get its offset.
963 if (Sym.StName)
964 Symbol.st_name = *Sym.StName;
965 else if (!Sym.Name.empty())
966 Symbol.st_name = Strtab.getOffset(ELFYAML::dropUniqueSuffix(Sym.Name));
967
968 Symbol.setBindingAndType(Sym.Binding, Sym.Type);
969 if (Sym.Section)
970 Symbol.st_shndx = toSectionIndex(*Sym.Section, "", Sym.Name);
971 else if (Sym.Index)
972 Symbol.st_shndx = *Sym.Index;
973
974 Symbol.st_value = Sym.Value.value_or(yaml::Hex64(0));
975 Symbol.st_other = Sym.Other.value_or(0);
976 Symbol.st_size = Sym.Size.value_or(yaml::Hex64(0));
977 }
978
979 return Ret;
980}
981
982template <class ELFT>
983void ELFState<ELFT>::initSymtabSectionHeader(Elf_Shdr &SHeader,
984 SymtabType STType,
985 ContiguousBlobAccumulator &CBA,
986 ELFYAML::Section *YAMLSec) {
987
988 bool IsStatic = STType == SymtabType::Static;
990 if (IsStatic && Doc.Symbols)
991 Symbols = *Doc.Symbols;
992 else if (!IsStatic && Doc.DynamicSymbols)
993 Symbols = *Doc.DynamicSymbols;
994
997 if (RawSec && (RawSec->Content || RawSec->Size)) {
998 bool HasSymbolsDescription =
999 (IsStatic && Doc.Symbols) || (!IsStatic && Doc.DynamicSymbols);
1000 if (HasSymbolsDescription) {
1001 StringRef Property = (IsStatic ? "`Symbols`" : "`DynamicSymbols`");
1002 if (RawSec->Content)
1003 reportError("cannot specify both `Content` and " + Property +
1004 " for symbol table section '" + RawSec->Name + "'");
1005 if (RawSec->Size)
1006 reportError("cannot specify both `Size` and " + Property +
1007 " for symbol table section '" + RawSec->Name + "'");
1008 return;
1009 }
1010 }
1011
1012 SHeader.sh_name = getSectionNameOffset(IsStatic ? ".symtab" : ".dynsym");
1013
1014 if (YAMLSec)
1015 SHeader.sh_type = YAMLSec->Type;
1016 else
1017 SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM;
1018
1019 if (YAMLSec && YAMLSec->Flags)
1020 SHeader.sh_flags = *YAMLSec->Flags;
1021 else if (!IsStatic)
1022 SHeader.sh_flags = ELF::SHF_ALLOC;
1023
1024 // If the symbol table section is explicitly described in the YAML
1025 // then we should set the fields requested.
1026 SHeader.sh_info = (RawSec && RawSec->Info) ? (unsigned)(*RawSec->Info)
1028 SHeader.sh_addralign = YAMLSec ? (uint64_t)YAMLSec->AddressAlign : 8;
1029
1030 assignSectionAddress(SHeader, YAMLSec);
1031
1032 SHeader.sh_offset = alignToOffset(CBA, SHeader.sh_addralign,
1033 RawSec ? RawSec->Offset : std::nullopt);
1034
1035 if (RawSec && (RawSec->Content || RawSec->Size)) {
1036 assert(Symbols.empty());
1037 SHeader.sh_size = writeContent(CBA, RawSec->Content, RawSec->Size);
1038 return;
1039 }
1040
1041 std::vector<Elf_Sym> Syms =
1042 toELFSymbols(Symbols, IsStatic ? DotStrtab : DotDynstr);
1043 SHeader.sh_size = Syms.size() * sizeof(Elf_Sym);
1044 CBA.write((const char *)Syms.data(), SHeader.sh_size);
1045}
1046
1047template <class ELFT>
1048void ELFState<ELFT>::initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name,
1049 StringTableBuilder &STB,
1050 ContiguousBlobAccumulator &CBA,
1051 ELFYAML::Section *YAMLSec) {
1052 SHeader.sh_name = getSectionNameOffset(ELFYAML::dropUniqueSuffix(Name));
1053 SHeader.sh_type = YAMLSec ? YAMLSec->Type : ELF::SHT_STRTAB;
1054 SHeader.sh_addralign = YAMLSec ? (uint64_t)YAMLSec->AddressAlign : 1;
1055
1058
1059 SHeader.sh_offset = alignToOffset(CBA, SHeader.sh_addralign,
1060 YAMLSec ? YAMLSec->Offset : std::nullopt);
1061
1062 if (RawSec && (RawSec->Content || RawSec->Size)) {
1063 SHeader.sh_size = writeContent(CBA, RawSec->Content, RawSec->Size);
1064 } else {
1065 if (raw_ostream *OS = CBA.getRawOS(STB.getSize()))
1066 STB.write(*OS);
1067 SHeader.sh_size = STB.getSize();
1068 }
1069
1070 if (RawSec && RawSec->Info)
1071 SHeader.sh_info = *RawSec->Info;
1072
1073 if (YAMLSec && YAMLSec->Flags)
1074 SHeader.sh_flags = *YAMLSec->Flags;
1075 else if (Name == ".dynstr")
1076 SHeader.sh_flags = ELF::SHF_ALLOC;
1077
1078 assignSectionAddress(SHeader, YAMLSec);
1079}
1080
1081static bool shouldEmitDWARF(DWARFYAML::Data &DWARF, StringRef Name) {
1082 SetVector<StringRef> DebugSecNames = DWARF.getNonEmptySectionNames();
1083 return Name.consume_front(".") && DebugSecNames.count(Name);
1084}
1085
1086template <class ELFT>
1087Expected<uint64_t> emitDWARF(typename ELFT::Shdr &SHeader, StringRef Name,
1088 const DWARFYAML::Data &DWARF,
1089 ContiguousBlobAccumulator &CBA) {
1090 // We are unable to predict the size of debug data, so we request to write 0
1091 // bytes. This should always return us an output stream unless CBA is already
1092 // in an error state.
1093 raw_ostream *OS = CBA.getRawOS(0);
1094 if (!OS)
1095 return 0;
1096
1097 uint64_t BeginOffset = CBA.tell();
1098
1099 auto EmitFunc = DWARFYAML::getDWARFEmitterByName(Name.substr(1));
1100 if (Error Err = EmitFunc(*OS, DWARF))
1101 return std::move(Err);
1102
1103 return CBA.tell() - BeginOffset;
1104}
1105
1106template <class ELFT>
1107void ELFState<ELFT>::initDWARFSectionHeader(Elf_Shdr &SHeader, StringRef Name,
1108 ContiguousBlobAccumulator &CBA,
1109 ELFYAML::Section *YAMLSec) {
1110 SHeader.sh_name = getSectionNameOffset(ELFYAML::dropUniqueSuffix(Name));
1111 SHeader.sh_type = YAMLSec ? YAMLSec->Type : ELF::SHT_PROGBITS;
1112 SHeader.sh_addralign = YAMLSec ? (uint64_t)YAMLSec->AddressAlign : 1;
1113 SHeader.sh_offset = alignToOffset(CBA, SHeader.sh_addralign,
1114 YAMLSec ? YAMLSec->Offset : std::nullopt);
1115
1118 if (Doc.DWARF && shouldEmitDWARF(*Doc.DWARF, Name)) {
1119 if (RawSec && (RawSec->Content || RawSec->Size))
1120 reportError("cannot specify section '" + Name +
1121 "' contents in the 'DWARF' entry and the 'Content' "
1122 "or 'Size' in the 'Sections' entry at the same time");
1123 else {
1124 if (Expected<uint64_t> ShSizeOrErr =
1125 emitDWARF<ELFT>(SHeader, Name, *Doc.DWARF, CBA))
1126 SHeader.sh_size = *ShSizeOrErr;
1127 else
1128 reportError(ShSizeOrErr.takeError());
1129 }
1130 } else if (RawSec)
1131 SHeader.sh_size = writeContent(CBA, RawSec->Content, RawSec->Size);
1132 else
1133 llvm_unreachable("debug sections can only be initialized via the 'DWARF' "
1134 "entry or a RawContentSection");
1135
1136 if (RawSec && RawSec->Info)
1137 SHeader.sh_info = *RawSec->Info;
1138
1139 if (YAMLSec && YAMLSec->Flags)
1140 SHeader.sh_flags = *YAMLSec->Flags;
1141 else if (Name == ".debug_str")
1142 SHeader.sh_flags = ELF::SHF_MERGE | ELF::SHF_STRINGS;
1143
1144 assignSectionAddress(SHeader, YAMLSec);
1145}
1146
1147template <class ELFT> void ELFState<ELFT>::reportError(const Twine &Msg) {
1148 ErrHandler(Msg);
1149 HasError = true;
1150}
1151
1152template <class ELFT> void ELFState<ELFT>::reportError(Error Err) {
1153 handleAllErrors(std::move(Err), [&](const ErrorInfoBase &Err) {
1154 reportError(Err.message());
1155 });
1156}
1157
1158template <class ELFT>
1159std::vector<Fragment>
1160ELFState<ELFT>::getPhdrFragments(const ELFYAML::ProgramHeader &Phdr,
1161 ArrayRef<Elf_Shdr> SHeaders) {
1162 std::vector<Fragment> Ret;
1163 for (const ELFYAML::Chunk *C : Phdr.Chunks) {
1164 if (const ELFYAML::Fill *F = dyn_cast<ELFYAML::Fill>(C)) {
1165 Ret.push_back({*F->Offset, F->Size, llvm::ELF::SHT_PROGBITS,
1166 /*ShAddrAlign=*/1});
1167 continue;
1168 }
1169
1171 const Elf_Shdr &H = SHeaders[SN2I.get(S->Name)];
1172 Ret.push_back({H.sh_offset, H.sh_size, H.sh_type, H.sh_addralign});
1173 }
1174 return Ret;
1175}
1176
1177template <class ELFT>
1178void ELFState<ELFT>::setProgramHeaderLayout(std::vector<Elf_Phdr> &PHeaders,
1179 std::vector<Elf_Shdr> &SHeaders) {
1180 uint32_t PhdrIdx = 0;
1181 for (auto &YamlPhdr : Doc.ProgramHeaders) {
1182 Elf_Phdr &PHeader = PHeaders[PhdrIdx++];
1183 std::vector<Fragment> Fragments = getPhdrFragments(YamlPhdr, SHeaders);
1184 if (!llvm::is_sorted(Fragments, [](const Fragment &A, const Fragment &B) {
1185 return A.Offset < B.Offset;
1186 }))
1187 reportError("sections in the program header with index " +
1188 Twine(PhdrIdx) + " are not sorted by their file offset");
1189
1190 if (YamlPhdr.Offset) {
1191 if (!Fragments.empty() && *YamlPhdr.Offset > Fragments.front().Offset)
1192 reportError("'Offset' for segment with index " + Twine(PhdrIdx) +
1193 " must be less than or equal to the minimum file offset of "
1194 "all included sections (0x" +
1195 Twine::utohexstr(Fragments.front().Offset) + ")");
1196 PHeader.p_offset = *YamlPhdr.Offset;
1197 } else if (!Fragments.empty()) {
1198 PHeader.p_offset = Fragments.front().Offset;
1199 }
1200
1201 // Set the file size if not set explicitly.
1202 if (YamlPhdr.FileSize) {
1203 PHeader.p_filesz = *YamlPhdr.FileSize;
1204 } else if (!Fragments.empty()) {
1205 uint64_t FileSize = Fragments.back().Offset - PHeader.p_offset;
1206 // SHT_NOBITS sections occupy no physical space in a file, we should not
1207 // take their sizes into account when calculating the file size of a
1208 // segment.
1209 if (Fragments.back().Type != llvm::ELF::SHT_NOBITS)
1210 FileSize += Fragments.back().Size;
1211 PHeader.p_filesz = FileSize;
1212 }
1213
1214 // Find the maximum offset of the end of a section in order to set p_memsz.
1215 uint64_t MemOffset = PHeader.p_offset;
1216 for (const Fragment &F : Fragments)
1217 MemOffset = std::max(MemOffset, F.Offset + F.Size);
1218 // Set the memory size if not set explicitly.
1219 PHeader.p_memsz = YamlPhdr.MemSize ? uint64_t(*YamlPhdr.MemSize)
1220 : MemOffset - PHeader.p_offset;
1221
1222 if (YamlPhdr.Align) {
1223 PHeader.p_align = *YamlPhdr.Align;
1224 } else {
1225 // Set the alignment of the segment to be the maximum alignment of the
1226 // sections so that by default the segment has a valid and sensible
1227 // alignment.
1228 PHeader.p_align = 1;
1229 for (const Fragment &F : Fragments)
1230 PHeader.p_align = std::max((uint64_t)PHeader.p_align, F.AddrAlign);
1231 }
1232 }
1233}
1234
1237 for (const ELFYAML::ProgramHeader &PH : Phdrs) {
1238 auto It = llvm::find_if(
1239 PH.Chunks, [&](ELFYAML::Chunk *C) { return C->Name == S.Name; });
1240 if (std::any_of(It, PH.Chunks.end(), [](ELFYAML::Chunk *C) {
1241 return (isa<ELFYAML::Fill>(C) ||
1242 cast<ELFYAML::Section>(C)->Type != ELF::SHT_NOBITS);
1243 }))
1244 return true;
1245 }
1246 return false;
1247}
1248
1249template <class ELFT>
1250void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1251 const ELFYAML::NoBitsSection &S,
1252 ContiguousBlobAccumulator &CBA) {
1253 if (!S.Size)
1254 return;
1255
1256 SHeader.sh_size = *S.Size;
1257
1258 // When a nobits section is followed by a non-nobits section or fill
1259 // in the same segment, we allocate the file space for it. This behavior
1260 // matches linkers.
1261 if (shouldAllocateFileSpace(Doc.ProgramHeaders, S))
1262 CBA.writeZeros(*S.Size);
1263}
1264
1265template <class ELFT>
1266void ELFState<ELFT>::writeSectionContent(
1267 Elf_Shdr &SHeader, const ELFYAML::RawContentSection &Section,
1268 ContiguousBlobAccumulator &CBA) {
1269 if (Section.Info)
1270 SHeader.sh_info = *Section.Info;
1271}
1272
1273static bool isMips64EL(const ELFYAML::Object &Obj) {
1274 return Obj.getMachine() == llvm::ELF::EM_MIPS &&
1275 Obj.Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64) &&
1276 Obj.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB);
1277}
1278
1279template <class ELFT>
1280void ELFState<ELFT>::writeSectionContent(
1281 Elf_Shdr &SHeader, const ELFYAML::RelocationSection &Section,
1282 ContiguousBlobAccumulator &CBA) {
1284 Section.Type == llvm::ELF::SHT_RELA ||
1285 Section.Type == llvm::ELF::SHT_CREL) &&
1286 "Section type is not SHT_REL nor SHT_RELA");
1287
1288 if (!Section.RelocatableSec.empty())
1289 SHeader.sh_info = toSectionIndex(Section.RelocatableSec, Section.Name);
1290
1291 if (!Section.Relocations)
1292 return;
1293
1294 const bool IsCrel = Section.Type == llvm::ELF::SHT_CREL;
1295 const bool IsRela = Section.Type == llvm::ELF::SHT_RELA;
1296 typename ELFT::uint OffsetMask = 8, Offset = 0, Addend = 0;
1297 uint32_t SymIdx = 0, Type = 0;
1298 uint64_t CurrentOffset = CBA.getOffset();
1299 if (IsCrel)
1300 for (const ELFYAML::Relocation &Rel : *Section.Relocations)
1301 OffsetMask |= Rel.Offset;
1302 const int Shift = llvm::countr_zero(OffsetMask);
1303 if (IsCrel)
1304 CBA.writeULEB128(Section.Relocations->size() * 8 + ELF::CREL_HDR_ADDEND +
1305 Shift);
1306 for (const ELFYAML::Relocation &Rel : *Section.Relocations) {
1307 const bool IsDynamic = Section.Link && (*Section.Link == ".dynsym");
1308 uint32_t CurSymIdx =
1309 Rel.Symbol ? toSymbolIndex(*Rel.Symbol, Section.Name, IsDynamic) : 0;
1310 if (IsCrel) {
1311 // The delta offset and flags member may be larger than uint64_t. Special
1312 // case the first byte (3 flag bits and 4 offset bits). Other ULEB128
1313 // bytes encode the remaining delta offset bits.
1314 auto DeltaOffset =
1315 (static_cast<typename ELFT::uint>(Rel.Offset) - Offset) >> Shift;
1316 Offset = Rel.Offset;
1317 uint8_t B =
1318 DeltaOffset * 8 + (SymIdx != CurSymIdx) + (Type != Rel.Type ? 2 : 0) +
1319 (Addend != static_cast<typename ELFT::uint>(Rel.Addend) ? 4 : 0);
1320 if (DeltaOffset < 0x10) {
1321 CBA.write(B);
1322 } else {
1323 CBA.write(B | 0x80);
1324 CBA.writeULEB128(DeltaOffset >> 4);
1325 }
1326 // Delta symidx/type/addend members (SLEB128).
1327 if (B & 1) {
1328 CBA.writeSLEB128(
1329 std::make_signed_t<typename ELFT::uint>(CurSymIdx - SymIdx));
1330 SymIdx = CurSymIdx;
1331 }
1332 if (B & 2) {
1333 CBA.writeSLEB128(static_cast<int32_t>(Rel.Type - Type));
1334 Type = Rel.Type;
1335 }
1336 if (B & 4) {
1337 CBA.writeSLEB128(
1338 std::make_signed_t<typename ELFT::uint>(Rel.Addend - Addend));
1339 Addend = Rel.Addend;
1340 }
1341 } else if (IsRela) {
1342 Elf_Rela REntry;
1343 zero(REntry);
1344 REntry.r_offset = Rel.Offset;
1345 REntry.r_addend = Rel.Addend;
1346 REntry.setSymbolAndType(CurSymIdx, Rel.Type, isMips64EL(Doc));
1347 CBA.write((const char *)&REntry, sizeof(REntry));
1348 } else {
1349 Elf_Rel REntry;
1350 zero(REntry);
1351 REntry.r_offset = Rel.Offset;
1352 REntry.setSymbolAndType(CurSymIdx, Rel.Type, isMips64EL(Doc));
1353 CBA.write((const char *)&REntry, sizeof(REntry));
1354 }
1355 }
1356
1357 SHeader.sh_size = CBA.getOffset() - CurrentOffset;
1358}
1359
1360template <class ELFT>
1361void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1362 const ELFYAML::RelrSection &Section,
1363 ContiguousBlobAccumulator &CBA) {
1364 if (!Section.Entries)
1365 return;
1366
1367 for (llvm::yaml::Hex64 E : *Section.Entries) {
1368 if (!ELFT::Is64Bits && E > UINT32_MAX)
1369 reportError(Section.Name + ": the value is too large for 32-bits: 0x" +
1371 CBA.write<uintX_t>(E, ELFT::Endianness);
1372 }
1373
1374 SHeader.sh_size = sizeof(uintX_t) * Section.Entries->size();
1375}
1376
1377template <class ELFT>
1378void ELFState<ELFT>::writeSectionContent(
1379 Elf_Shdr &SHeader, const ELFYAML::SymtabShndxSection &Shndx,
1380 ContiguousBlobAccumulator &CBA) {
1381 if (Shndx.Content || Shndx.Size) {
1382 SHeader.sh_size = writeContent(CBA, Shndx.Content, Shndx.Size);
1383 return;
1384 }
1385
1386 if (!Shndx.Entries)
1387 return;
1388
1389 for (uint32_t E : *Shndx.Entries)
1390 CBA.write<uint32_t>(E, ELFT::Endianness);
1391 SHeader.sh_size = Shndx.Entries->size() * SHeader.sh_entsize;
1392}
1393
1394template <class ELFT>
1395void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1396 const ELFYAML::GroupSection &Section,
1397 ContiguousBlobAccumulator &CBA) {
1399 "Section type is not SHT_GROUP");
1400
1401 if (Section.Signature)
1402 SHeader.sh_info =
1403 toSymbolIndex(*Section.Signature, Section.Name, /*IsDynamic=*/false);
1404
1405 if (!Section.Members)
1406 return;
1407
1408 for (const ELFYAML::SectionOrType &Member : *Section.Members) {
1409 unsigned int SectionIndex = 0;
1410 if (Member.sectionNameOrType == "GRP_COMDAT")
1411 SectionIndex = llvm::ELF::GRP_COMDAT;
1412 else
1413 SectionIndex = toSectionIndex(Member.sectionNameOrType, Section.Name);
1414 CBA.write<uint32_t>(SectionIndex, ELFT::Endianness);
1415 }
1416 SHeader.sh_size = SHeader.sh_entsize * Section.Members->size();
1417}
1418
1419template <class ELFT>
1420void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1421 const ELFYAML::SymverSection &Section,
1422 ContiguousBlobAccumulator &CBA) {
1423 if (!Section.Entries)
1424 return;
1425
1426 for (uint16_t Version : *Section.Entries)
1427 CBA.write<uint16_t>(Version, ELFT::Endianness);
1428 SHeader.sh_size = Section.Entries->size() * SHeader.sh_entsize;
1429}
1430
1431template <class ELFT>
1432void ELFState<ELFT>::writeSectionContent(
1433 Elf_Shdr &SHeader, const ELFYAML::StackSizesSection &Section,
1434 ContiguousBlobAccumulator &CBA) {
1435 if (!Section.Entries)
1436 return;
1437
1438 for (const ELFYAML::StackSizeEntry &E : *Section.Entries) {
1439 CBA.write<uintX_t>(E.Address, ELFT::Endianness);
1440 SHeader.sh_size += sizeof(uintX_t) + CBA.writeULEB128(E.Size);
1441 }
1442}
1443
1444template <class ELFT>
1445void ELFState<ELFT>::writeSectionContent(
1446 Elf_Shdr &SHeader, const ELFYAML::BBAddrMapSection &Section,
1447 ContiguousBlobAccumulator &CBA) {
1448 if (!Section.Entries) {
1449 if (Section.PGOAnalyses)
1451 << "PGOAnalyses should not exist in SHT_LLVM_BB_ADDR_MAP when "
1452 "Entries does not exist";
1453 return;
1454 }
1455
1456 const std::vector<BBAddrMapYAML::PGOAnalysisMapEntry> *PGOAnalyses = nullptr;
1457 if (Section.PGOAnalyses) {
1458 if (Section.Entries->size() != Section.PGOAnalyses->size())
1459 WithColor::warning() << "PGOAnalyses must be the same length as Entries "
1460 "in SHT_LLVM_BB_ADDR_MAP";
1461 else
1462 PGOAnalyses = &Section.PGOAnalyses.value();
1463 }
1464
1465 for (const auto &[Idx, E] : llvm::enumerate(*Section.Entries)) {
1466 // Write version and feature values.
1468 if (E.Version > 5)
1469 WithColor::warning() << "unsupported SHT_LLVM_BB_ADDR_MAP version: "
1470 << static_cast<int>(E.Version)
1471 << "; encoding using the most recent version";
1472 CBA.write(E.Version);
1473 SHeader.sh_size += 1;
1474 if (E.Version < 5) {
1475 CBA.write(static_cast<uint8_t>(E.Feature));
1476 SHeader.sh_size += 1;
1477 } else {
1478 CBA.write<uint16_t>(E.Feature, ELFT::Endianness);
1479 SHeader.sh_size += 2;
1480 }
1481 }
1482 auto FeatureOrErr = llvm::object::BBAddrMap::Features::decode(E.Feature);
1483 if (!FeatureOrErr) {
1484 // Invalid feature: warn and skip the entry.
1485 WithColor::warning() << toString(FeatureOrErr.takeError());
1486 continue;
1487 }
1488 bool MultiBBRangeFeatureEnabled = FeatureOrErr->MultiBBRange;
1489 bool MultiBBRange =
1490 MultiBBRangeFeatureEnabled ||
1491 (E.NumBBRanges.has_value() && E.NumBBRanges.value() != 1) ||
1492 (E.BBRanges && E.BBRanges->size() != 1);
1493 if (MultiBBRange && !MultiBBRangeFeatureEnabled)
1494 WithColor::warning() << "feature value(" << E.Feature
1495 << ") does not support multiple BB ranges.";
1496 if (MultiBBRange) {
1497 // Write the number of basic block ranges, which is overridden by the
1498 // 'NumBBRanges' field when specified.
1499 uint64_t NumBBRanges =
1500 E.NumBBRanges.value_or(E.BBRanges ? E.BBRanges->size() : 0);
1501 SHeader.sh_size += CBA.writeULEB128(NumBBRanges);
1502 }
1503 if (!E.BBRanges)
1504 continue;
1505 uint64_t TotalNumBlocks = 0;
1506 bool EmitCallsiteEndOffsets =
1507 FeatureOrErr->CallsiteEndOffsets || E.hasAnyCallsiteEndOffsets();
1508 for (const BBAddrMapYAML::BBAddrMapEntry::BBRangeEntry &BBR : *E.BBRanges) {
1509 // Write the base address of the range.
1510 CBA.write<uintX_t>(BBR.BaseAddress, ELFT::Endianness);
1511 // Write number of BBEntries (number of basic blocks in this basic block
1512 // range). This is overridden by the 'NumBlocks' YAML field when
1513 // specified.
1514 uint64_t NumBlocks =
1515 BBR.NumBlocks.value_or(BBR.BBEntries ? BBR.BBEntries->size() : 0);
1516 SHeader.sh_size += sizeof(uintX_t) + CBA.writeULEB128(NumBlocks);
1517 // Write all BBEntries in this BBRange.
1518 if (!BBR.BBEntries || FeatureOrErr->OmitBBEntries)
1519 continue;
1520 for (const BBAddrMapYAML::BBAddrMapEntry::BBEntry &BBE : *BBR.BBEntries) {
1521 ++TotalNumBlocks;
1522 if (Section.Type == llvm::ELF::SHT_LLVM_BB_ADDR_MAP && E.Version > 1)
1523 SHeader.sh_size += CBA.writeULEB128(BBE.ID);
1524 SHeader.sh_size += CBA.writeULEB128(BBE.AddressOffset);
1525 if (EmitCallsiteEndOffsets) {
1526 size_t NumCallsiteEndOffsets =
1527 BBE.CallsiteEndOffsets ? BBE.CallsiteEndOffsets->size() : 0;
1528 SHeader.sh_size += CBA.writeULEB128(NumCallsiteEndOffsets);
1529 if (BBE.CallsiteEndOffsets) {
1531 SHeader.sh_size += CBA.writeULEB128(Offset);
1532 }
1533 }
1534 SHeader.sh_size += CBA.writeULEB128(BBE.Size);
1535 SHeader.sh_size += CBA.writeULEB128(BBE.Metadata);
1536 if (FeatureOrErr->BBHash || BBE.Hash.has_value()) {
1537 uint64_t Hash =
1538 BBE.Hash.has_value() ? BBE.Hash.value() : llvm::yaml::Hex64(0);
1539 CBA.write<uint64_t>(Hash, ELFT::Endianness);
1540 SHeader.sh_size += 8;
1541 }
1542 }
1543 }
1544 if (!PGOAnalyses)
1545 continue;
1546 const BBAddrMapYAML::PGOAnalysisMapEntry &PGOEntry = PGOAnalyses->at(Idx);
1547
1548 if (PGOEntry.FuncEntryCount)
1549 SHeader.sh_size += CBA.writeULEB128(*PGOEntry.FuncEntryCount);
1550
1551 if (!PGOEntry.PGOBBEntries)
1552 continue;
1553
1554 const auto &PGOBBEntries = PGOEntry.PGOBBEntries.value();
1555 if (TotalNumBlocks != PGOBBEntries.size()) {
1556 WithColor::warning() << "PBOBBEntries must be the same length as "
1557 "BBEntries in SHT_LLVM_BB_ADDR_MAP.\n"
1558 << "Mismatch on function with address: "
1559 << E.getFunctionAddress();
1560 continue;
1561 }
1562
1563 for (const auto &PGOBBE : PGOBBEntries) {
1564 if (PGOBBE.BBFreq)
1565 SHeader.sh_size += CBA.writeULEB128(*PGOBBE.BBFreq);
1566 if (FeatureOrErr->PostLinkCfg || PGOBBE.PostLinkBBFreq.has_value())
1567 SHeader.sh_size += CBA.writeULEB128(PGOBBE.PostLinkBBFreq.value_or(0));
1568 if (PGOBBE.Successors) {
1569 SHeader.sh_size += CBA.writeULEB128(PGOBBE.Successors->size());
1570 for (const auto &[ID, BrProb, PostLinkBrFreq] : *PGOBBE.Successors) {
1571 SHeader.sh_size += CBA.writeULEB128(ID);
1572 SHeader.sh_size += CBA.writeULEB128(BrProb);
1573 if (FeatureOrErr->PostLinkCfg || PostLinkBrFreq.has_value())
1574 SHeader.sh_size += CBA.writeULEB128(PostLinkBrFreq.value_or(0));
1575 }
1576 }
1577 }
1578 }
1579}
1580
1581template <class ELFT>
1582void ELFState<ELFT>::writeSectionContent(
1583 Elf_Shdr &SHeader, const ELFYAML::LinkerOptionsSection &Section,
1584 ContiguousBlobAccumulator &CBA) {
1585 if (!Section.Options)
1586 return;
1587
1588 for (const ELFYAML::LinkerOption &LO : *Section.Options) {
1589 CBA.write(LO.Key.data(), LO.Key.size());
1590 CBA.write('\0');
1591 CBA.write(LO.Value.data(), LO.Value.size());
1592 CBA.write('\0');
1593 SHeader.sh_size += (LO.Key.size() + LO.Value.size() + 2);
1594 }
1595}
1596
1597template <class ELFT>
1598void ELFState<ELFT>::writeSectionContent(
1599 Elf_Shdr &SHeader, const ELFYAML::DependentLibrariesSection &Section,
1600 ContiguousBlobAccumulator &CBA) {
1601 if (!Section.Libs)
1602 return;
1603
1604 for (StringRef Lib : *Section.Libs) {
1605 CBA.write(Lib.data(), Lib.size());
1606 CBA.write('\0');
1607 SHeader.sh_size += Lib.size() + 1;
1608 }
1609}
1610
1611template <class ELFT>
1613ELFState<ELFT>::alignToOffset(ContiguousBlobAccumulator &CBA, uint64_t Align,
1614 std::optional<llvm::yaml::Hex64> Offset) {
1615 uint64_t CurrentOffset = CBA.getOffset();
1616 uint64_t AlignedOffset;
1617
1618 if (Offset) {
1619 if ((uint64_t)*Offset < CurrentOffset) {
1620 reportError("the 'Offset' value (0x" +
1621 Twine::utohexstr((uint64_t)*Offset) + ") goes backward");
1622 return CurrentOffset;
1623 }
1624
1625 // We ignore an alignment when an explicit offset has been requested.
1626 AlignedOffset = *Offset;
1627 } else {
1628 AlignedOffset = alignTo(CurrentOffset, std::max(Align, (uint64_t)1));
1629 }
1630
1631 CBA.writeZeros(AlignedOffset - CurrentOffset);
1632 return AlignedOffset;
1633}
1634
1635template <class ELFT>
1636void ELFState<ELFT>::writeSectionContent(
1637 Elf_Shdr &SHeader, const ELFYAML::CallGraphProfileSection &Section,
1638 ContiguousBlobAccumulator &CBA) {
1639 if (!Section.Entries)
1640 return;
1641
1642 for (const ELFYAML::CallGraphEntryWeight &E : *Section.Entries) {
1643 CBA.write<uint64_t>(E.Weight, ELFT::Endianness);
1644 SHeader.sh_size += sizeof(object::Elf_CGProfile_Impl<ELFT>);
1645 }
1646}
1647
1648template <class ELFT>
1649void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1650 const ELFYAML::HashSection &Section,
1651 ContiguousBlobAccumulator &CBA) {
1652 if (!Section.Bucket)
1653 return;
1654
1655 CBA.write<uint32_t>(
1656 Section.NBucket.value_or(llvm::yaml::Hex64(Section.Bucket->size())),
1657 ELFT::Endianness);
1658 CBA.write<uint32_t>(
1659 Section.NChain.value_or(llvm::yaml::Hex64(Section.Chain->size())),
1660 ELFT::Endianness);
1661
1662 for (uint32_t Val : *Section.Bucket)
1663 CBA.write<uint32_t>(Val, ELFT::Endianness);
1664 for (uint32_t Val : *Section.Chain)
1665 CBA.write<uint32_t>(Val, ELFT::Endianness);
1666
1667 SHeader.sh_size = (2 + Section.Bucket->size() + Section.Chain->size()) * 4;
1668}
1669
1670template <class ELFT>
1671void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1672 const ELFYAML::VerdefSection &Section,
1673 ContiguousBlobAccumulator &CBA) {
1674
1675 if (Section.Info)
1676 SHeader.sh_info = *Section.Info;
1677 else if (Section.Entries)
1678 SHeader.sh_info = Section.Entries->size();
1679
1680 if (!Section.Entries)
1681 return;
1682
1683 uint64_t AuxCnt = 0;
1684 for (size_t I = 0; I < Section.Entries->size(); ++I) {
1685 const ELFYAML::VerdefEntry &E = (*Section.Entries)[I];
1686
1687 Elf_Verdef VerDef;
1688 VerDef.vd_version = E.Version.value_or(1);
1689 VerDef.vd_flags = E.Flags.value_or(0);
1690 VerDef.vd_ndx = E.VersionNdx.value_or(0);
1691 VerDef.vd_hash = E.Hash.value_or(0);
1692 VerDef.vd_aux = E.VDAux.value_or(sizeof(Elf_Verdef));
1693 VerDef.vd_cnt = E.VerNames.size();
1694 if (I == Section.Entries->size() - 1)
1695 VerDef.vd_next = 0;
1696 else
1697 VerDef.vd_next =
1698 sizeof(Elf_Verdef) + E.VerNames.size() * sizeof(Elf_Verdaux);
1699 CBA.write((const char *)&VerDef, sizeof(Elf_Verdef));
1700
1701 for (size_t J = 0; J < E.VerNames.size(); ++J, ++AuxCnt) {
1702 Elf_Verdaux VerdAux;
1703 VerdAux.vda_name = DotDynstr.getOffset(E.VerNames[J]);
1704 if (J == E.VerNames.size() - 1)
1705 VerdAux.vda_next = 0;
1706 else
1707 VerdAux.vda_next = sizeof(Elf_Verdaux);
1708 CBA.write((const char *)&VerdAux, sizeof(Elf_Verdaux));
1709 }
1710 }
1711
1712 SHeader.sh_size = Section.Entries->size() * sizeof(Elf_Verdef) +
1713 AuxCnt * sizeof(Elf_Verdaux);
1714}
1715
1716template <class ELFT>
1717void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1718 const ELFYAML::VerneedSection &Section,
1719 ContiguousBlobAccumulator &CBA) {
1720 if (Section.Info)
1721 SHeader.sh_info = *Section.Info;
1722 else if (Section.VerneedV)
1723 SHeader.sh_info = Section.VerneedV->size();
1724
1725 if (!Section.VerneedV)
1726 return;
1727
1728 uint64_t AuxCnt = 0;
1729 for (size_t I = 0; I < Section.VerneedV->size(); ++I) {
1730 const ELFYAML::VerneedEntry &VE = (*Section.VerneedV)[I];
1731
1732 Elf_Verneed VerNeed;
1733 VerNeed.vn_version = VE.Version;
1734 VerNeed.vn_file = DotDynstr.getOffset(VE.File);
1735 if (I == Section.VerneedV->size() - 1)
1736 VerNeed.vn_next = 0;
1737 else
1738 VerNeed.vn_next =
1739 sizeof(Elf_Verneed) + VE.AuxV.size() * sizeof(Elf_Vernaux);
1740 VerNeed.vn_cnt = VE.AuxV.size();
1741 VerNeed.vn_aux = sizeof(Elf_Verneed);
1742 CBA.write((const char *)&VerNeed, sizeof(Elf_Verneed));
1743
1744 for (size_t J = 0; J < VE.AuxV.size(); ++J, ++AuxCnt) {
1745 const ELFYAML::VernauxEntry &VAuxE = VE.AuxV[J];
1746
1747 Elf_Vernaux VernAux;
1748 VernAux.vna_hash = VAuxE.Hash;
1749 VernAux.vna_flags = VAuxE.Flags;
1750 VernAux.vna_other = VAuxE.Other;
1751 VernAux.vna_name = DotDynstr.getOffset(VAuxE.Name);
1752 if (J == VE.AuxV.size() - 1)
1753 VernAux.vna_next = 0;
1754 else
1755 VernAux.vna_next = sizeof(Elf_Vernaux);
1756 CBA.write((const char *)&VernAux, sizeof(Elf_Vernaux));
1757 }
1758 }
1759
1760 SHeader.sh_size = Section.VerneedV->size() * sizeof(Elf_Verneed) +
1761 AuxCnt * sizeof(Elf_Vernaux);
1762}
1763
1764template <class ELFT>
1765void ELFState<ELFT>::writeSectionContent(
1766 Elf_Shdr &SHeader, const ELFYAML::ARMIndexTableSection &Section,
1767 ContiguousBlobAccumulator &CBA) {
1768 if (!Section.Entries)
1769 return;
1770
1771 for (const ELFYAML::ARMIndexTableEntry &E : *Section.Entries) {
1772 CBA.write<uint32_t>(E.Offset, ELFT::Endianness);
1773 CBA.write<uint32_t>(E.Value, ELFT::Endianness);
1774 }
1775 SHeader.sh_size = Section.Entries->size() * 8;
1776}
1777
1778template <class ELFT>
1779void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1780 const ELFYAML::MipsABIFlags &Section,
1781 ContiguousBlobAccumulator &CBA) {
1783 "Section type is not SHT_MIPS_ABIFLAGS");
1784
1786 zero(Flags);
1787 SHeader.sh_size = SHeader.sh_entsize;
1788
1789 Flags.version = Section.Version;
1790 Flags.isa_level = Section.ISALevel;
1791 Flags.isa_rev = Section.ISARevision;
1792 Flags.gpr_size = Section.GPRSize;
1793 Flags.cpr1_size = Section.CPR1Size;
1794 Flags.cpr2_size = Section.CPR2Size;
1795 Flags.fp_abi = Section.FpABI;
1796 Flags.isa_ext = Section.ISAExtension;
1797 Flags.ases = Section.ASEs;
1798 Flags.flags1 = Section.Flags1;
1799 Flags.flags2 = Section.Flags2;
1800 CBA.write((const char *)&Flags, sizeof(Flags));
1801}
1802
1803template <class ELFT>
1804void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1805 const ELFYAML::DynamicSection &Section,
1806 ContiguousBlobAccumulator &CBA) {
1808 "Section type is not SHT_DYNAMIC");
1809
1810 if (!Section.Entries)
1811 return;
1812
1813 for (const ELFYAML::DynamicEntry &DE : *Section.Entries) {
1814 CBA.write<uintX_t>(DE.Tag, ELFT::Endianness);
1815 CBA.write<uintX_t>(DE.Val, ELFT::Endianness);
1816 }
1817 SHeader.sh_size = 2 * sizeof(uintX_t) * Section.Entries->size();
1818}
1819
1820template <class ELFT>
1821void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1822 const ELFYAML::AddrsigSection &Section,
1823 ContiguousBlobAccumulator &CBA) {
1824 if (!Section.Symbols)
1825 return;
1826
1827 for (StringRef Sym : *Section.Symbols)
1828 SHeader.sh_size +=
1829 CBA.writeULEB128(toSymbolIndex(Sym, Section.Name, /*IsDynamic=*/false));
1830}
1831
1832template <class ELFT>
1833void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1834 const ELFYAML::NoteSection &Section,
1835 ContiguousBlobAccumulator &CBA) {
1836 if (!Section.Notes || Section.Notes->empty())
1837 return;
1838
1839 unsigned Align;
1840 switch (Section.AddressAlign) {
1841 case 0:
1842 case 4:
1843 Align = 4;
1844 break;
1845 case 8:
1846 Align = 8;
1847 break;
1848 default:
1849 reportError(Section.Name + ": invalid alignment for a note section: 0x" +
1850 Twine::utohexstr(Section.AddressAlign));
1851 return;
1852 }
1853
1854 if (CBA.getOffset() != alignTo(CBA.getOffset(), Align)) {
1855 reportError(Section.Name + ": invalid offset of a note section: 0x" +
1856 Twine::utohexstr(CBA.getOffset()) + ", should be aligned to " +
1857 Twine(Align));
1858 return;
1859 }
1860
1861 uint64_t Offset = CBA.tell();
1862 for (const ELFYAML::NoteEntry &NE : *Section.Notes) {
1863 // Write name size.
1864 if (NE.Name.empty())
1865 CBA.write<uint32_t>(0, ELFT::Endianness);
1866 else
1867 CBA.write<uint32_t>(NE.Name.size() + 1, ELFT::Endianness);
1868
1869 // Write description size.
1870 if (NE.Desc.binary_size() == 0)
1871 CBA.write<uint32_t>(0, ELFT::Endianness);
1872 else
1873 CBA.write<uint32_t>(NE.Desc.binary_size(), ELFT::Endianness);
1874
1875 // Write type.
1876 CBA.write<uint32_t>(NE.Type, ELFT::Endianness);
1877
1878 // Write name, null terminator and padding.
1879 if (!NE.Name.empty()) {
1880 CBA.write(NE.Name.data(), NE.Name.size());
1881 CBA.write('\0');
1882 }
1883
1884 // Write description and padding.
1885 if (NE.Desc.binary_size() != 0) {
1886 CBA.padToAlignment(Align);
1887 CBA.writeAsBinary(NE.Desc);
1888 }
1889
1890 CBA.padToAlignment(Align);
1891 }
1892
1893 SHeader.sh_size = CBA.tell() - Offset;
1894}
1895
1896template <class ELFT>
1897void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
1898 const ELFYAML::GnuHashSection &Section,
1899 ContiguousBlobAccumulator &CBA) {
1900 if (!Section.HashBuckets)
1901 return;
1902
1903 if (!Section.Header)
1904 return;
1905
1906 // We write the header first, starting with the hash buckets count. Normally
1907 // it is the number of entries in HashBuckets, but the "NBuckets" property can
1908 // be used to override this field, which is useful for producing broken
1909 // objects.
1910 if (Section.Header->NBuckets)
1911 CBA.write<uint32_t>(*Section.Header->NBuckets, ELFT::Endianness);
1912 else
1913 CBA.write<uint32_t>(Section.HashBuckets->size(), ELFT::Endianness);
1914
1915 // Write the index of the first symbol in the dynamic symbol table accessible
1916 // via the hash table.
1917 CBA.write<uint32_t>(Section.Header->SymNdx, ELFT::Endianness);
1918
1919 // Write the number of words in the Bloom filter. As above, the "MaskWords"
1920 // property can be used to set this field to any value.
1921 if (Section.Header->MaskWords)
1922 CBA.write<uint32_t>(*Section.Header->MaskWords, ELFT::Endianness);
1923 else
1924 CBA.write<uint32_t>(Section.BloomFilter->size(), ELFT::Endianness);
1925
1926 // Write the shift constant used by the Bloom filter.
1927 CBA.write<uint32_t>(Section.Header->Shift2, ELFT::Endianness);
1928
1929 // We've finished writing the header. Now write the Bloom filter.
1930 for (llvm::yaml::Hex64 Val : *Section.BloomFilter)
1931 CBA.write<uintX_t>(Val, ELFT::Endianness);
1932
1933 // Write an array of hash buckets.
1934 for (llvm::yaml::Hex32 Val : *Section.HashBuckets)
1935 CBA.write<uint32_t>(Val, ELFT::Endianness);
1936
1937 // Write an array of hash values.
1938 for (llvm::yaml::Hex32 Val : *Section.HashValues)
1939 CBA.write<uint32_t>(Val, ELFT::Endianness);
1940
1941 SHeader.sh_size = 16 /*Header size*/ +
1942 Section.BloomFilter->size() * sizeof(typename ELFT::uint) +
1943 Section.HashBuckets->size() * 4 +
1944 Section.HashValues->size() * 4;
1945}
1946
1947template <class ELFT>
1948void ELFState<ELFT>::writeFill(ELFYAML::Fill &Fill,
1949 ContiguousBlobAccumulator &CBA) {
1950 size_t PatternSize = Fill.Pattern ? Fill.Pattern->binary_size() : 0;
1951 if (!PatternSize) {
1952 CBA.writeZeros(Fill.Size);
1953 return;
1954 }
1955
1956 // Fill the content with the specified pattern.
1957 uint64_t Written = 0;
1958 for (; Written + PatternSize <= Fill.Size; Written += PatternSize)
1959 CBA.writeAsBinary(*Fill.Pattern);
1960 CBA.writeAsBinary(*Fill.Pattern, Fill.Size - Written);
1961}
1962
1963template <class ELFT>
1964DenseMap<StringRef, size_t> ELFState<ELFT>::buildSectionHeaderReorderMap() {
1965 const ELFYAML::SectionHeaderTable &SectionHeaders =
1966 Doc.getSectionHeaderTable();
1967 if (SectionHeaders.IsImplicit || SectionHeaders.NoHeaders ||
1968 SectionHeaders.isDefault())
1970
1972 size_t SecNdx = 0;
1973 StringSet<> Seen;
1974
1975 auto AddSection = [&](const ELFYAML::SectionHeader &Hdr) {
1976 if (!Ret.try_emplace(Hdr.Name, ++SecNdx).second)
1977 reportError("repeated section name: '" + Hdr.Name +
1978 "' in the section header description");
1979 Seen.insert(Hdr.Name);
1980 };
1981
1982 if (SectionHeaders.Sections)
1983 for (const ELFYAML::SectionHeader &Hdr : *SectionHeaders.Sections)
1984 AddSection(Hdr);
1985
1986 if (SectionHeaders.Excluded)
1987 for (const ELFYAML::SectionHeader &Hdr : *SectionHeaders.Excluded)
1988 AddSection(Hdr);
1989
1990 for (const ELFYAML::Section *S : Doc.getSections()) {
1991 // Ignore special first SHT_NULL section.
1992 if (S == Doc.getSections().front())
1993 continue;
1994 if (!Seen.count(S->Name))
1995 reportError("section '" + S->Name +
1996 "' should be present in the 'Sections' or 'Excluded' lists");
1997 Seen.erase(S->Name);
1998 }
1999
2000 for (const auto &It : Seen)
2001 reportError("section header contains undefined section '" + It.getKey() +
2002 "'");
2003 return Ret;
2004}
2005
2006template <class ELFT> void ELFState<ELFT>::buildSectionIndex() {
2007 // A YAML description can have an explicit section header declaration that
2008 // allows to change the order of section headers.
2009 DenseMap<StringRef, size_t> ReorderMap = buildSectionHeaderReorderMap();
2010
2011 if (HasError)
2012 return;
2013
2014 // Build excluded section headers map.
2015 std::vector<ELFYAML::Section *> Sections = Doc.getSections();
2016 const ELFYAML::SectionHeaderTable &SectionHeaders =
2017 Doc.getSectionHeaderTable();
2018 if (SectionHeaders.Excluded)
2019 for (const ELFYAML::SectionHeader &Hdr : *SectionHeaders.Excluded)
2020 if (!ExcludedSectionHeaders.insert(Hdr.Name).second)
2021 llvm_unreachable("buildSectionIndex() failed");
2022
2023 if (SectionHeaders.NoHeaders.value_or(false))
2024 for (const ELFYAML::Section *S : Sections)
2025 if (!ExcludedSectionHeaders.insert(S->Name).second)
2026 llvm_unreachable("buildSectionIndex() failed");
2027
2028 size_t SecNdx = -1;
2029 for (const ELFYAML::Section *S : Sections) {
2030 ++SecNdx;
2031
2032 size_t Index = ReorderMap.empty() ? SecNdx : ReorderMap.lookup(S->Name);
2033 if (!SN2I.addName(S->Name, Index))
2034 llvm_unreachable("buildSectionIndex() failed");
2035
2036 if (!ExcludedSectionHeaders.count(S->Name))
2037 ShStrtabStrings->add(ELFYAML::dropUniqueSuffix(S->Name));
2038 }
2039}
2040
2041template <class ELFT> void ELFState<ELFT>::buildSymbolIndexes() {
2042 auto Build = [this](ArrayRef<ELFYAML::Symbol> V, NameToIdxMap &Map) {
2043 for (size_t I = 0, S = V.size(); I < S; ++I) {
2044 const ELFYAML::Symbol &Sym = V[I];
2045 if (!Sym.Name.empty() && !Map.addName(Sym.Name, I + 1))
2046 reportError("repeated symbol name: '" + Sym.Name + "'");
2047 }
2048 };
2049
2050 if (Doc.Symbols)
2051 Build(*Doc.Symbols, SymN2I);
2052 if (Doc.DynamicSymbols)
2053 Build(*Doc.DynamicSymbols, DynSymN2I);
2054}
2055
2056template <class ELFT> void ELFState<ELFT>::finalizeStrings() {
2057 // Add the regular symbol names to .strtab section.
2058 if (Doc.Symbols)
2059 for (const ELFYAML::Symbol &Sym : *Doc.Symbols)
2060 DotStrtab.add(ELFYAML::dropUniqueSuffix(Sym.Name));
2061 DotStrtab.finalize();
2062
2063 // Add the dynamic symbol names to .dynstr section.
2064 if (Doc.DynamicSymbols)
2065 for (const ELFYAML::Symbol &Sym : *Doc.DynamicSymbols)
2066 DotDynstr.add(ELFYAML::dropUniqueSuffix(Sym.Name));
2067
2068 // SHT_GNU_verdef and SHT_GNU_verneed sections might also
2069 // add strings to .dynstr section.
2070 for (const ELFYAML::Chunk *Sec : Doc.getSections()) {
2071 if (auto VerNeed = dyn_cast<ELFYAML::VerneedSection>(Sec)) {
2072 if (VerNeed->VerneedV) {
2073 for (const ELFYAML::VerneedEntry &VE : *VerNeed->VerneedV) {
2074 DotDynstr.add(VE.File);
2075 for (const ELFYAML::VernauxEntry &Aux : VE.AuxV)
2076 DotDynstr.add(Aux.Name);
2077 }
2078 }
2079 } else if (auto VerDef = dyn_cast<ELFYAML::VerdefSection>(Sec)) {
2080 if (VerDef->Entries)
2081 for (const ELFYAML::VerdefEntry &E : *VerDef->Entries)
2082 for (StringRef Name : E.VerNames)
2083 DotDynstr.add(Name);
2084 }
2085 }
2086
2087 DotDynstr.finalize();
2088
2089 // Don't finalize the section header string table a second time if it has
2090 // already been finalized due to being one of the symbol string tables.
2091 if (ShStrtabStrings != &DotStrtab && ShStrtabStrings != &DotDynstr)
2092 ShStrtabStrings->finalize();
2093}
2094
2095template <class ELFT>
2096bool ELFState<ELFT>::writeELF(raw_ostream &OS, ELFYAML::Object &Doc,
2097 yaml::ErrorHandler EH, uint64_t MaxSize) {
2098 ELFState<ELFT> State(Doc, EH);
2099 if (State.HasError)
2100 return false;
2101
2102 // Build the section index, which adds sections to the section header string
2103 // table first, so that we can finalize the section header string table.
2104 State.buildSectionIndex();
2105 State.buildSymbolIndexes();
2106
2107 // Finalize section header string table and the .strtab and .dynstr sections.
2108 // We do this early because we want to finalize the string table builders
2109 // before writing the content of the sections that might want to use them.
2110 State.finalizeStrings();
2111
2112 if (State.HasError)
2113 return false;
2114
2115 std::vector<Elf_Phdr> PHeaders;
2116 State.initProgramHeaders(PHeaders);
2117
2118 // XXX: This offset is tightly coupled with the order that we write
2119 // things to `OS`.
2120 const size_t SectionContentBeginOffset =
2121 sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * Doc.ProgramHeaders.size();
2122 // It is quite easy to accidentally create output with yaml2obj that is larger
2123 // than intended, for example, due to an issue in the YAML description.
2124 // We limit the maximum allowed output size, but also provide a command line
2125 // option to change this limitation.
2126 ContiguousBlobAccumulator CBA(SectionContentBeginOffset, MaxSize);
2127
2128 std::vector<Elf_Shdr> SHeaders;
2129 State.initSectionHeaders(SHeaders, CBA);
2130
2131 // Now we can decide segment offsets.
2132 State.setProgramHeaderLayout(PHeaders, SHeaders);
2133
2134 // Override section fields, if requested. This needs to happen after program
2135 // header layout happens, because otherwise the layout will use the new
2136 // values.
2137 State.overrideSectionHeaders(SHeaders);
2138
2139 bool ReachedLimit = CBA.getOffset() > MaxSize;
2140 if (Error E = CBA.takeLimitError()) {
2141 // We report a custom error message instead below.
2142 consumeError(std::move(E));
2143 ReachedLimit = true;
2144 }
2145
2146 if (ReachedLimit)
2147 State.reportError(
2148 "the desired output size is greater than permitted. Use the "
2149 "--max-size option to change the limit");
2150
2151 if (State.HasError)
2152 return false;
2153
2154 State.writeELFHeader(OS);
2155 writeArrayData(OS, ArrayRef(PHeaders));
2156
2158 if (!SHT.NoHeaders.value_or(false))
2159 CBA.updateDataAt(*SHT.Offset, SHeaders.data(),
2160 SHT.getNumHeaders(SHeaders.size()) * sizeof(Elf_Shdr));
2161
2162 CBA.writeBlobToStream(OS);
2163 return true;
2164}
2165
2166namespace llvm {
2167namespace yaml {
2168
2170 uint64_t MaxSize) {
2171 bool IsLE = Doc.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB);
2172 bool Is64Bit = Doc.Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64);
2173 if (Is64Bit) {
2174 if (IsLE)
2175 return ELFState<object::ELF64LE>::writeELF(Out, Doc, EH, MaxSize);
2176 return ELFState<object::ELF64BE>::writeELF(Out, Doc, EH, MaxSize);
2177 }
2178 if (IsLE)
2179 return ELFState<object::ELF32LE>::writeELF(Out, Doc, EH, MaxSize);
2180 return ELFState<object::ELF32BE>::writeELF(Out, Doc, EH, MaxSize);
2181}
2182
2183} // namespace yaml
2184} // namespace llvm
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static Error reportError(StringRef Message)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Common declarations for yaml2obj.
This file declares classes for handling the YAML representation of DWARF Debug Info.
DXIL Resource Implicit Binding
This file defines the DenseMap class.
static StringRef getDefaultLinkSec(unsigned SecType)
constexpr char SuffixEnd
static void overrideFields(ELFYAML::Section *From, typename ELFT::Shdr &To)
static void writeArrayData(raw_ostream &OS, ArrayRef< T > A)
static bool isMips64EL(const ELFYAML::Object &Obj)
static size_t arrayDataSize(ArrayRef< T > A)
constexpr char SuffixStart
static void zero(T &Obj)
static bool shouldEmitDWARF(DWARFYAML::Data &DWARF, StringRef Name)
static uint64_t writeContent(ContiguousBlobAccumulator &CBA, const std::optional< yaml::BinaryRef > &Content, const std::optional< llvm::yaml::Hex64 > &Size)
Expected< uint64_t > emitDWARF(typename ELFT::Shdr &SHeader, StringRef Name, const DWARFYAML::Data &DWARF, ContiguousBlobAccumulator &CBA)
static size_t findFirstNonGlobal(ArrayRef< ELFYAML::Symbol > Symbols)
#define LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
Definition ELFTypes.h:119
This file declares classes for handling the YAML representation of ELF.
static cl::opt< unsigned > SizeLimit("eif-limit", cl::init(6), cl::Hidden, cl::desc("Size limit in Hexagon early if-conversion"))
static bool lookup(const GsymReader &GR, GsymDataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define H(x, y, z)
Definition MD5.cpp:56
#define T
if(PassOpts->AAPipeline)
This file implements a set that has insertion order iteration characteristics.
StringSet - A set-like wrapper for the StringMap.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:252
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:301
bool empty() const
Definition DenseMap.h:173
Base class for error info classes.
Definition Error.h:44
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:262
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:151
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:339
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Definition StringMap.h:290
void erase(iterator I)
Definition StringMap.h:438
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
static constexpr size_t npos
Definition StringRef.h:58
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:591
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
char back() const
Get the last character in the string.
Definition StringRef.h:153
size_t rfind(char C, size_t From=npos) const
Search for the last character C in the string.
Definition StringRef.h:365
StringRef copy(Allocator &A) const
Definition StringRef.h:160
StringSet - A wrapper for StringMap that provides set-like functionality.
Definition StringSet.h:25
std::pair< typename Base::iterator, bool > insert(StringRef key)
Definition StringSet.h:39
Utility for building string tables with deduplicated suffixes.
LLVM_ABI size_t getOffset(CachedHashStringRef S) const
Get the offest of a string in the string table.
LLVM_ABI void write(raw_ostream &OS) const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static Twine utohexstr(uint64_t Val)
Definition Twine.h:385
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI raw_ostream & warning()
Convenience method for printing "warning: " to stderr.
Definition WithColor.cpp:85
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & write(unsigned char C)
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI std::function< Error(raw_ostream &, const Data &)> getDWARFEmitterByName(StringRef SecName)
LLVM_ABI std::string appendUniqueSuffix(StringRef Name, const Twine &Msg)
unsigned getDefaultShEntSize(unsigned EMachine, ELF_SHT SecType, StringRef SecName)
Definition ELFYAML.h:78
LLVM_ABI StringRef dropUniqueSuffix(StringRef S)
LLVM_ABI bool shouldAllocateFileSpace(ArrayRef< ProgramHeader > Phdrs, const NoBitsSection &S)
@ EV_CURRENT
Definition ELF.h:130
@ SHF_MERGE
Definition ELF.h:1257
@ SHF_STRINGS
Definition ELF.h:1260
@ SHF_ALLOC
Definition ELF.h:1251
@ EI_DATA
Definition ELF.h:56
@ EI_MAG3
Definition ELF.h:54
@ EI_MAG1
Definition ELF.h:52
@ EI_VERSION
Definition ELF.h:57
@ EI_MAG2
Definition ELF.h:53
@ EI_ABIVERSION
Definition ELF.h:59
@ EI_MAG0
Definition ELF.h:51
@ EI_CLASS
Definition ELF.h:55
@ EI_OSABI
Definition ELF.h:58
@ EM_NONE
Definition ELF.h:138
@ EM_MIPS
Definition ELF.h:146
@ SHT_STRTAB
Definition ELF.h:1152
@ SHT_GROUP
Definition ELF.h:1164
@ SHT_PROGBITS
Definition ELF.h:1150
@ SHT_REL
Definition ELF.h:1158
@ SHT_NULL
Definition ELF.h:1149
@ SHT_LLVM_CALL_GRAPH_PROFILE
Definition ELF.h:1187
@ SHT_NOBITS
Definition ELF.h:1157
@ SHT_SYMTAB
Definition ELF.h:1151
@ SHT_GNU_verneed
Definition ELF.h:1201
@ SHT_GNU_verdef
Definition ELF.h:1200
@ SHT_CREL
Definition ELF.h:1171
@ SHT_DYNAMIC
Definition ELF.h:1155
@ SHT_LLVM_ADDRSIG
Definition ELF.h:1179
@ SHT_LLVM_BB_ADDR_MAP
Definition ELF.h:1188
@ SHT_GNU_HASH
Definition ELF.h:1199
@ SHT_RELA
Definition ELF.h:1153
@ SHT_DYNSYM
Definition ELF.h:1160
@ SHT_MIPS_ABIFLAGS
Definition ELF.h:1230
@ SHT_GNU_versym
Definition ELF.h:1202
@ SHT_HASH
Definition ELF.h:1154
@ STB_LOCAL
Definition ELF.h:1407
constexpr unsigned CREL_HDR_ADDEND
Definition ELF.h:2057
@ ELFDATA2LSB
Definition ELF.h:340
@ ELFCLASS64
Definition ELF.h:334
@ ELFCLASS32
Definition ELF.h:333
@ ET_REL
Definition ELF.h:119
@ GRP_COMDAT
Definition ELF.h:1354
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
Definition Endian.h:96
LLVM_ABI bool yaml2elf(ELFYAML::Object &Doc, raw_ostream &Out, ErrorHandler EH, uint64_t MaxSize)
llvm::function_ref< void(const Twine &Msg)> ErrorHandler
Definition yaml2obj.h:68
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:558
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1668
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2553
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
Definition Error.h:1013
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1321
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
Definition STLExtras.h:1969
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:221
@ Dynamic
Denotes mode unknown at compile time.
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a SLEB128 value to an output stream.
Definition LEB128.h:24
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1771
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
Definition LEB128.h:79
bool to_integer(StringRef S, N &Num, unsigned Base=0)
Convert the string S to an integer of the specified type using the radix Base. If Base is 0,...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
endianness
Definition bit.h:71
void consumeError(Error Err)
Consume a Error without doing anything.
Definition Error.h:1106
LLVM_ABI Error write(DWPWriter &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue, raw_pwrite_stream *OS=nullptr)
Definition DWP.cpp:721
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
std::optional< std::vector< llvm::yaml::Hex64 > > CallsiteEndOffsets
std::optional< llvm::yaml::Hex64 > Hash
std::optional< std::vector< BBEntry > > BBEntries
std::optional< uint64_t > FuncEntryCount
std::optional< std::vector< PGOBBEntry > > PGOBBEntries
LLVM_ABI SetVector< StringRef > getNonEmptySectionNames() const
Definition DWARFYAML.cpp:25
std::optional< llvm::yaml::Hex64 > Offset
Definition ELFYAML.h:203
llvm::yaml::Hex64 Val
Definition ELFYAML.h:157
llvm::yaml::Hex64 Size
Definition ELFYAML.h:273
std::optional< yaml::BinaryRef > Pattern
Definition ELFYAML.h:272
const SectionHeaderTable & getSectionHeaderTable() const
Definition ELFYAML.h:709
FileHeader Header
Definition ELFYAML.h:686
std::vector< ProgramHeader > ProgramHeaders
Definition ELFYAML.h:687
std::optional< llvm::yaml::Hex64 > Align
Definition ELFYAML.h:674
llvm::yaml::Hex64 PAddr
Definition ELFYAML.h:673
std::optional< llvm::yaml::Hex64 > Offset
Definition ELFYAML.h:677
llvm::yaml::Hex64 VAddr
Definition ELFYAML.h:672
std::optional< llvm::yaml::Hex64 > MemSize
Definition ELFYAML.h:676
std::optional< StringRef > FirstSec
Definition ELFYAML.h:678
std::optional< StringRef > LastSec
Definition ELFYAML.h:679
std::optional< llvm::yaml::Hex64 > FileSize
Definition ELFYAML.h:675
std::vector< Chunk * > Chunks
Definition ELFYAML.h:682
std::optional< llvm::yaml::Hex64 > Info
Definition ELFYAML.h:351
std::optional< StringRef > Symbol
Definition ELFYAML.h:583
llvm::yaml::Hex64 Offset
Definition ELFYAML.h:580
std::optional< std::vector< SectionHeader > > Excluded
Definition ELFYAML.h:289
std::optional< bool > NoHeaders
Definition ELFYAML.h:290
size_t getNumHeaders(size_t SectionsNum) const
Definition ELFYAML.h:292
std::optional< std::vector< SectionHeader > > Sections
Definition ELFYAML.h:288
std::optional< llvm::yaml::Hex64 > Address
Definition ELFYAML.h:216
std::optional< StringRef > Link
Definition ELFYAML.h:217
std::optional< llvm::yaml::Hex64 > Size
Definition ELFYAML.h:222
std::optional< llvm::yaml::Hex64 > ShAddrAlign
Definition ELFYAML.h:244
llvm::yaml::Hex64 AddressAlign
Definition ELFYAML.h:218
std::optional< ELF_SHF > Flags
Definition ELFYAML.h:215
std::optional< ELF_SHT > ShType
Definition ELFYAML.h:265
std::optional< llvm::yaml::Hex64 > ShOffset
Definition ELFYAML.h:252
std::optional< llvm::yaml::Hex64 > ShFlags
Definition ELFYAML.h:259
std::optional< llvm::yaml::Hex64 > ShName
Definition ELFYAML.h:248
std::optional< yaml::BinaryRef > Content
Definition ELFYAML.h:221
std::optional< llvm::yaml::Hex64 > EntSize
Definition ELFYAML.h:219
std::optional< llvm::yaml::Hex64 > ShSize
Definition ELFYAML.h:256
std::optional< std::vector< uint32_t > > Entries
Definition ELFYAML.h:616
static Expected< Features > decode(uint16_t Val)
Definition BBAddrMap.h:62
Common declarations for yaml2obj.