Lines Matching +full:write +full:- +full:to +full:- +full:write
1 //===- yaml2xcoff - Convert YAML to a xcoff object file -------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 //===----------------------------------------------------------------------===//
77 // Map the section name to its corrresponding section index.
93 W.write(NameRef); in writeName()
121 // If the YAML file specified an offset to relocations, we use it. in initRelocations()
163 // Section data addresses (physical/virtual) are related to symbol in initSectionHeaders()
164 // addresses and alignments. Furthermore, it is possible to specify the in initSectionHeaders()
167 // it is not possible to compute valid section addresses. The only in initSectionHeaders()
170 // the .tdata section. Therefore, we only assign addresses to the .bss in initSectionHeaders()
171 // and .tbss sections if they do not already have non-zero addresses. in initSectionHeaders()
172 // (If the YAML file is being used to generate a valid object file, we in initSectionHeaders()
173 // expect all section addresses to be specified explicitly.) in initSectionHeaders()
223 ErrHandler("the low-order bits of DWARFSectionSubtype must be 0"); in initSectionHeaders()
234 size_t RawSize = Obj.StrTbl.RawContent->binary_size(); in initStringTable()
257 // Add all specified strings to the string table. in initStringTable()
262 size_t NumOfStrings = Obj.StrTbl.Strings->size(); in initStringTable()
282 // Check if the file name in the File Auxiliary Entry should be added to the in initStringTable()
288 if (nameShouldBeInStringTable(AS->FileNameOrString.value_or(""))) in initStringTable()
289 StrTblBuilder.add(AS->FileNameOrString.value_or("")); in initStringTable()
324 // Add the number of auxiliary symbols to the total number. in initFileHeader()
358 // Set these section-related values if not set explicitly. We assume that the in initAuxFileHeader()
440 W.write<uint16_t>(Obj.Header.Magic ? Obj.Header.Magic : InitFileHdr.Magic); in writeFileHeader()
441 W.write<uint16_t>(Obj.Header.NumberOfSections ? Obj.Header.NumberOfSections in writeFileHeader()
443 W.write<int32_t>(Obj.Header.TimeStamp); in writeFileHeader()
445 W.write<uint64_t>(InitFileHdr.SymbolTableOffset); in writeFileHeader()
446 W.write<uint16_t>(InitFileHdr.AuxHeaderSize); in writeFileHeader()
447 W.write<uint16_t>(Obj.Header.Flags); in writeFileHeader()
448 W.write<int32_t>(Obj.Header.NumberOfSymTableEntries in writeFileHeader()
452 W.write<uint32_t>(InitFileHdr.SymbolTableOffset); in writeFileHeader()
453 W.write<int32_t>(Obj.Header.NumberOfSymTableEntries in writeFileHeader()
456 W.write<uint16_t>(InitFileHdr.AuxHeaderSize); in writeFileHeader()
457 W.write<uint16_t>(Obj.Header.Flags); in writeFileHeader()
462 W.write<uint16_t>(InitAuxFileHdr.Magic.value_or(yaml::Hex16(1))); in writeAuxFileHeader()
463 W.write<uint16_t>(InitAuxFileHdr.Version.value_or(yaml::Hex16(1))); in writeAuxFileHeader()
466 W.write<uint64_t>(InitAuxFileHdr.TextStartAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
467 W.write<uint64_t>(InitAuxFileHdr.DataStartAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
468 W.write<uint64_t>(InitAuxFileHdr.TOCAnchorAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
470 W.write<uint32_t>(InitAuxFileHdr.TextSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
471 W.write<uint32_t>(InitAuxFileHdr.InitDataSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
472 W.write<uint32_t>(InitAuxFileHdr.BssDataSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
473 W.write<uint32_t>(InitAuxFileHdr.EntryPointAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
474 W.write<uint32_t>(InitAuxFileHdr.TextStartAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
475 W.write<uint32_t>(InitAuxFileHdr.DataStartAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
476 // A short 32-bit auxiliary header ends here. in writeAuxFileHeader()
479 W.write<uint32_t>(InitAuxFileHdr.TOCAnchorAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
481 W.write<uint16_t>(InitAuxFileHdr.SecNumOfEntryPoint.value_or(0)); in writeAuxFileHeader()
482 W.write<uint16_t>(InitAuxFileHdr.SecNumOfText.value_or(0)); in writeAuxFileHeader()
483 W.write<uint16_t>(InitAuxFileHdr.SecNumOfData.value_or(0)); in writeAuxFileHeader()
484 W.write<uint16_t>(InitAuxFileHdr.SecNumOfTOC.value_or(0)); in writeAuxFileHeader()
485 W.write<uint16_t>(InitAuxFileHdr.SecNumOfLoader.value_or(0)); in writeAuxFileHeader()
486 W.write<uint16_t>(InitAuxFileHdr.SecNumOfBSS.value_or(0)); in writeAuxFileHeader()
487 W.write<uint16_t>(InitAuxFileHdr.MaxAlignOfText.value_or(yaml::Hex16(0))); in writeAuxFileHeader()
488 W.write<uint16_t>(InitAuxFileHdr.MaxAlignOfData.value_or(yaml::Hex16(0))); in writeAuxFileHeader()
489 W.write<uint16_t>(InitAuxFileHdr.ModuleType.value_or(yaml::Hex16(0))); in writeAuxFileHeader()
490 W.write<uint8_t>(InitAuxFileHdr.CpuFlag.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
491 W.write<uint8_t>(0); // Reserved for CPU type. in writeAuxFileHeader()
493 W.write<uint8_t>(InitAuxFileHdr.TextPageSize.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
494 W.write<uint8_t>(InitAuxFileHdr.DataPageSize.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
495 W.write<uint8_t>(InitAuxFileHdr.StackPageSize.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
496 W.write<uint8_t>( in writeAuxFileHeader()
498 W.write<uint64_t>(InitAuxFileHdr.TextSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
499 W.write<uint64_t>(InitAuxFileHdr.InitDataSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
500 W.write<uint64_t>(InitAuxFileHdr.BssDataSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
501 W.write<uint64_t>(InitAuxFileHdr.EntryPointAddr.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
502 W.write<uint64_t>(InitAuxFileHdr.MaxStackSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
503 W.write<uint64_t>(InitAuxFileHdr.MaxDataSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
505 W.write<uint32_t>(InitAuxFileHdr.MaxStackSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
506 W.write<uint32_t>(InitAuxFileHdr.MaxDataSize.value_or(yaml::Hex64(0))); in writeAuxFileHeader()
508 W.write<uint8_t>(InitAuxFileHdr.TextPageSize.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
509 W.write<uint8_t>(InitAuxFileHdr.DataPageSize.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
510 W.write<uint8_t>(InitAuxFileHdr.StackPageSize.value_or(yaml::Hex8(0))); in writeAuxFileHeader()
511 W.write<uint8_t>( in writeAuxFileHeader()
514 W.write<uint16_t>(InitAuxFileHdr.SecNumOfTData.value_or(0)); in writeAuxFileHeader()
515 W.write<uint16_t>(InitAuxFileHdr.SecNumOfTBSS.value_or(0)); in writeAuxFileHeader()
517 W.write<uint16_t>( in writeAuxFileHeader()
520 W.OS.write_zeros(InitFileHdr.AuxHeaderSize - XCOFF::AuxFileHeaderSize64); in writeAuxFileHeader()
523 W.OS.write_zeros(InitFileHdr.AuxHeaderSize - XCOFF::AuxFileHeaderSize32); in writeAuxFileHeader()
533 W.write<uint64_t>(DerivedSec.Address); // Physical address in writeSectionHeaders()
534 W.write<uint64_t>(DerivedSec.Address); // Virtual address in writeSectionHeaders()
535 W.write<uint64_t>(DerivedSec.Size); in writeSectionHeaders()
536 W.write<uint64_t>(DerivedSec.FileOffsetToData); in writeSectionHeaders()
537 W.write<uint64_t>(DerivedSec.FileOffsetToRelocations); in writeSectionHeaders()
538 W.write<uint64_t>(DerivedSec.FileOffsetToLineNumbers); in writeSectionHeaders()
539 W.write<uint32_t>(DerivedSec.NumberOfRelocations); in writeSectionHeaders()
540 W.write<uint32_t>(DerivedSec.NumberOfLineNumbers); in writeSectionHeaders()
541 W.write<int32_t>(DerivedSec.Flags); in writeSectionHeaders()
545 W.write<uint32_t>(DerivedSec.Address); // Physical address in writeSectionHeaders()
546 W.write<uint32_t>(DerivedSec.Address); // Virtual address in writeSectionHeaders()
547 W.write<uint32_t>(DerivedSec.Size); in writeSectionHeaders()
548 W.write<uint32_t>(DerivedSec.FileOffsetToData); in writeSectionHeaders()
549 W.write<uint32_t>(DerivedSec.FileOffsetToRelocations); in writeSectionHeaders()
550 W.write<uint32_t>(DerivedSec.FileOffsetToLineNumbers); in writeSectionHeaders()
551 W.write<uint16_t>(DerivedSec.NumberOfRelocations); in writeSectionHeaders()
552 W.write<uint16_t>(DerivedSec.NumberOfLineNumbers); in writeSectionHeaders()
553 W.write<int32_t>(DerivedSec.Flags); in writeSectionHeaders()
563 int64_t PaddingSize = (uint64_t)InitSections[I].FileOffsetToData - in writeSectionData()
564 (W.OS.tell() - StartOffset); in writeSectionData()
581 InitSections[I].FileOffsetToRelocations - (W.OS.tell() - StartOffset); in writeRelocations()
589 W.write<uint64_t>(YamlRel.VirtualAddress); in writeRelocations()
591 W.write<uint32_t>(YamlRel.VirtualAddress); in writeRelocations()
592 W.write<uint32_t>(YamlRel.SymbolIndex); in writeRelocations()
593 W.write<uint8_t>(YamlRel.Info); in writeRelocations()
594 W.write<uint8_t>(YamlRel.Type); in writeRelocations()
635 W.write<uint32_t>(AuxSym.SectionOrLengthLo.value_or(0)); in writeAuxSymbol()
636 W.write<uint32_t>(AuxSym.ParameterHashIndex.value_or(0)); in writeAuxSymbol()
637 W.write<uint16_t>(AuxSym.TypeChkSectNum.value_or(0)); in writeAuxSymbol()
638 W.write<uint8_t>(SymAlignAndType); in writeAuxSymbol()
639 W.write<uint8_t>(AuxSym.StorageMappingClass.value_or(XCOFF::XMC_PR)); in writeAuxSymbol()
640 W.write<uint32_t>(AuxSym.SectionOrLengthHi.value_or(0)); in writeAuxSymbol()
641 W.write<uint8_t>(0); in writeAuxSymbol()
642 W.write<uint8_t>(XCOFF::AUX_CSECT); in writeAuxSymbol()
644 W.write<uint32_t>(AuxSym.SectionOrLength.value_or(0)); in writeAuxSymbol()
645 W.write<uint32_t>(AuxSym.ParameterHashIndex.value_or(0)); in writeAuxSymbol()
646 W.write<uint16_t>(AuxSym.TypeChkSectNum.value_or(0)); in writeAuxSymbol()
647 W.write<uint8_t>(SymAlignAndType); in writeAuxSymbol()
648 W.write<uint8_t>(AuxSym.StorageMappingClass.value_or(XCOFF::XMC_PR)); in writeAuxSymbol()
649 W.write<uint32_t>(AuxSym.StabInfoIndex.value_or(0)); in writeAuxSymbol()
650 W.write<uint16_t>(AuxSym.StabSectNum.value_or(0)); in writeAuxSymbol()
656 assert(Is64Bit && "can't write the exception auxiliary symbol for XCOFF32"); in writeAuxSymbol()
657 W.write<uint64_t>(AuxSym.OffsetToExceptionTbl.value_or(0)); in writeAuxSymbol()
658 W.write<uint32_t>(AuxSym.SizeOfFunction.value_or(0)); in writeAuxSymbol()
659 W.write<uint32_t>(AuxSym.SymIdxOfNextBeyond.value_or(0)); in writeAuxSymbol()
660 W.write<uint8_t>(0); in writeAuxSymbol()
661 W.write<uint8_t>(XCOFF::AUX_EXCEPT); in writeAuxSymbol()
667 W.write<uint64_t>(AuxSym.PtrToLineNum.value_or(0)); in writeAuxSymbol()
668 W.write<uint32_t>(AuxSym.SizeOfFunction.value_or(0)); in writeAuxSymbol()
669 W.write<uint32_t>(AuxSym.SymIdxOfNextBeyond.value_or(0)); in writeAuxSymbol()
670 W.write<uint8_t>(0); in writeAuxSymbol()
671 W.write<uint8_t>(XCOFF::AUX_FCN); in writeAuxSymbol()
673 W.write<uint32_t>(AuxSym.OffsetToExceptionTbl.value_or(0)); in writeAuxSymbol()
674 W.write<uint32_t>(AuxSym.SizeOfFunction.value_or(0)); in writeAuxSymbol()
675 W.write<uint32_t>(AuxSym.PtrToLineNum.value_or(0)); in writeAuxSymbol()
676 W.write<uint32_t>(AuxSym.SymIdxOfNextBeyond.value_or(0)); in writeAuxSymbol()
685 W.write<int32_t>(0); in writeAuxSymbol()
686 W.write<uint32_t>(StrTblBuilder.getOffset(FileName)); in writeAuxSymbol()
691 W.write<uint8_t>(AuxSym.FileStringType.value_or(XCOFF::XFT_FN)); in writeAuxSymbol()
694 W.write<uint8_t>(XCOFF::AUX_FILE); in writeAuxSymbol()
703 W.write<uint32_t>(AuxSym.LineNum.value_or(0)); in writeAuxSymbol()
705 W.write<uint8_t>(XCOFF::AUX_SYM); in writeAuxSymbol()
708 W.write<uint16_t>(AuxSym.LineNumHi.value_or(0)); in writeAuxSymbol()
709 W.write<uint16_t>(AuxSym.LineNumLo.value_or(0)); in writeAuxSymbol()
717 W.write<uint64_t>(AuxSym.LengthOfSectionPortion.value_or(0)); in writeAuxSymbol()
718 W.write<uint64_t>(AuxSym.NumberOfRelocEnt.value_or(0)); in writeAuxSymbol()
719 W.write<uint8_t>(0); in writeAuxSymbol()
720 W.write<uint8_t>(XCOFF::AUX_SECT); in writeAuxSymbol()
722 W.write<uint32_t>(AuxSym.LengthOfSectionPortion.value_or(0)); in writeAuxSymbol()
724 W.write<uint32_t>(AuxSym.NumberOfRelocEnt.value_or(0)); in writeAuxSymbol()
731 assert(!Is64Bit && "can't write the stat auxiliary symbol for XCOFF64"); in writeAuxSymbol()
732 W.write<uint32_t>(AuxSym.SectionLength.value_or(0)); in writeAuxSymbol()
733 W.write<uint16_t>(AuxSym.NumberOfRelocEnt.value_or(0)); in writeAuxSymbol()
734 W.write<uint16_t>(AuxSym.NumberOfLineNum.value_or(0)); in writeAuxSymbol()
761 InitFileHdr.SymbolTableOffset - (W.OS.tell() - StartOffset); in writeSymbols()
769 W.write<uint64_t>(YamlSym.Value); in writeSymbols()
770 W.write<uint32_t>(StrTblBuilder.getOffset(YamlSym.SymbolName)); in writeSymbols()
775 W.write<int32_t>(0); in writeSymbols()
776 W.write<uint32_t>(StrTblBuilder.getOffset(YamlSym.SymbolName)); in writeSymbols()
780 W.write<uint32_t>(YamlSym.Value); in writeSymbols()
792 ") refer to different sections"); in writeSymbols()
795 W.write<int16_t>(SectionIndexMap[*YamlSym.SectionName]); in writeSymbols()
797 W.write<int16_t>(YamlSym.SectionIndex ? *YamlSym.SectionIndex : 0); in writeSymbols()
799 W.write<uint16_t>(YamlSym.Type); in writeSymbols()
800 W.write<uint8_t>(YamlSym.StorageClass); in writeSymbols()
803 W.write<uint8_t>(NumOfAuxSym); in writeSymbols()
808 // Now write auxiliary entries. in writeSymbols()
820 (NumOfAuxSym - YamlSym.AuxEntries.size())); in writeSymbols()
828 Obj.StrTbl.RawContent->writeAsBinary(W.OS); in writeStringTable()
830 assert(*Obj.StrTbl.ContentSize >= Obj.StrTbl.RawContent->binary_size() && in writeStringTable()
832 W.OS.write_zeros(*Obj.StrTbl.ContentSize - in writeStringTable()
833 Obj.StrTbl.RawContent->binary_size()); in writeStringTable()
839 // If neither Length nor ContentSize is specified, write the StrTblBuilder in writeStringTable()
840 // directly, which contains the auto-generated Length value. in writeStringTable()
844 StrTblBuilder.write(W.OS); in writeStringTable()
848 // Serialize the string table's content to a temporary buffer. in writeStringTable()
851 uint8_t *Ptr = reinterpret_cast<uint8_t *>(Buf->getBufferStart()); in writeStringTable()
852 StrTblBuilder.write(Ptr); in writeStringTable()
853 // Replace the first 4 bytes, which contain the auto-generated Length value, in writeStringTable()
858 // Copy the buffer content to the actual output stream. in writeStringTable()
859 W.OS.write(Buf->getBufferStart(), Buf->getBufferSize()); in writeStringTable()
864 W.OS.write_zeros(*Obj.StrTbl.ContentSize - StrTblBuilderSize); in writeStringTable()