Lines Matching full:coff

9 // This file contains an implementation of a Win32 COFF object file writer.
20 #include "llvm/BinaryFormat/COFF.h"
58 using name = SmallString<COFF::NameSize>;
64 COFF::Auxiliary Aux;
71 COFF::symbol Data = {};
95 // This class contains staging data for a COFF relocation entry.
97 COFF::relocation Data;
102 static size_t size() { return COFF::RelocationSize; }
109 COFF::section Header = {};
136 COFF::header Header = {};
184 void WriteFileHeader(const COFF::header &Header);
188 void WriteRelocation(const COFF::relocation &R);
238 UseOffsetLabels = COFF::isAnyArm64(Header.Machine);
261 return COFF::IMAGE_SCN_ALIGN_1BYTES;
263 return COFF::IMAGE_SCN_ALIGN_2BYTES;
265 return COFF::IMAGE_SCN_ALIGN_4BYTES;
267 return COFF::IMAGE_SCN_ALIGN_8BYTES;
269 return COFF::IMAGE_SCN_ALIGN_16BYTES;
271 return COFF::IMAGE_SCN_ALIGN_32BYTES;
273 return COFF::IMAGE_SCN_ALIGN_64BYTES;
275 return COFF::IMAGE_SCN_ALIGN_128BYTES;
277 return COFF::IMAGE_SCN_ALIGN_256BYTES;
279 return COFF::IMAGE_SCN_ALIGN_512BYTES;
281 return COFF::IMAGE_SCN_ALIGN_1024BYTES;
283 return COFF::IMAGE_SCN_ALIGN_2048BYTES;
285 return COFF::IMAGE_SCN_ALIGN_4096BYTES;
287 return COFF::IMAGE_SCN_ALIGN_8192BYTES;
293 /// and creates the associated COFF section staging object.
301 Symbol->Data.StorageClass = COFF::IMAGE_SYM_CLASS_STATIC;
304 if (MCSec.getSelection() != COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) {
323 // Bind internal COFF section to MC section.
335 Label->Data.StorageClass = COFF::IMAGE_SYM_CLASS_LABEL;
370 /// and creates the associated COFF symbol staging object.
387 Sym->Data.StorageClass = COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL;
395 WeakDefault->Data.SectionNumber = COFF::IMAGE_SYM_ABSOLUTE;
413 Sym->Data.SectionNumber = COFF::IMAGE_SYM_ABSOLUTE;
427 if (Local->Data.StorageClass == COFF::IMAGE_SYM_CLASS_NULL) {
431 Local->Data.StorageClass = IsExternal ? COFF::IMAGE_SYM_CLASS_EXTERNAL
432 : COFF::IMAGE_SYM_CLASS_STATIC;
440 if (S.Name.size() <= COFF::NameSize) {
446 if (!COFF::encodeSectionName(S.Header.Name, StringTableEntry))
447 report_fatal_error("COFF string table is greater than 64 GB.");
451 if (S.Name.size() > COFF::NameSize)
458 return (S->Header.Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) ==
465 void WinCOFFWriter::WriteFileHeader(const COFF::header &Header) {
467 W.write<uint16_t>(COFF::IMAGE_FILE_MACHINE_UNKNOWN);
469 W.write<uint16_t>(COFF::BigObjHeader::MinBigObjectVersion);
472 W.OS.write(COFF::BigObjMagic, sizeof(COFF::BigObjMagic));
492 W.OS.write(S.Data.Name, COFF::NameSize);
513 W.OS.write_zeros(COFF::Symbol32Size - COFF::Symbol16Size);
517 UseBigObj ? COFF::Symbol32Size : COFF::Symbol16Size);
530 W.OS.write_zeros(COFF::Symbol32Size - COFF::Symbol16Size);
552 COFF::section &S = Section->Header;
554 S.Characteristics |= COFF::IMAGE_SCN_LNK_NRELOC_OVFL;
555 W.OS.write(S.Name, COFF::NameSize);
568 void WinCOFFWriter::WriteRelocation(const COFF::relocation &R) {
626 COFF::relocation R;
642 unsigned SymbolSize = UseBigObj ? COFF::Symbol32Size : COFF::Symbol16Size;
646 File->Data.SectionNumber = COFF::IMAGE_SYM_DEBUG;
647 File->Data.StorageClass = COFF::IMAGE_SYM_CLASS_FILE;
687 if (Sym->Data.StorageClass != COFF::IMAGE_SYM_CLASS_EXTERNAL)
690 if (!Sym->Section && Sym->Data.SectionNumber != COFF::IMAGE_SYM_ABSOLUTE)
693 Sym->Section->Header.Characteristics & COFF::IMAGE_SCN_LNK_COMDAT)
712 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE;
724 // Although it is not explicitly requested by the Microsoft COFF spec,
735 // Assign file offsets to COFF object file structures.
739 Offset += UseBigObj ? COFF::Header32Size : COFF::Header16Size;
740 Offset += COFF::SectionSize * Header.NumberOfSections;
769 Offset += COFF::RelocationSize;
772 Offset += COFF::RelocationSize * Sec->Relocations.size();
776 if (Header.Machine != COFF::IMAGE_FILE_MACHINE_R4000 ||
777 Relocation.Data.Type != COFF::IMAGE_REL_MIPS_PAIR) {
823 cast<MCSymbolCOFF>(Symbol).getClass() == COFF::IMAGE_SYM_CLASS_STATIC)
826 UseBigObj = Sections.size() > COFF::MaxNumberOfSections16;
831 "PE COFF object files can't have more than 2147483647 sections");
930 if ((Header.Machine == COFF::IMAGE_FILE_MACHINE_AMD64 &&
931 Reloc.Data.Type == COFF::IMAGE_REL_AMD64_REL32) ||
932 (Header.Machine == COFF::IMAGE_FILE_MACHINE_I386 &&
933 Reloc.Data.Type == COFF::IMAGE_REL_I386_REL32) ||
934 (Header.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT &&
935 Reloc.Data.Type == COFF::IMAGE_REL_ARM_REL32) ||
936 (COFF::isAnyArm64(Header.Machine) &&
937 Reloc.Data.Type == COFF::IMAGE_REL_ARM64_REL32))
940 if (Header.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) {
942 case COFF::IMAGE_REL_ARM_ABSOLUTE:
943 case COFF::IMAGE_REL_ARM_ADDR32:
944 case COFF::IMAGE_REL_ARM_ADDR32NB:
945 case COFF::IMAGE_REL_ARM_TOKEN:
946 case COFF::IMAGE_REL_ARM_SECTION:
947 case COFF::IMAGE_REL_ARM_SECREL:
949 case COFF::IMAGE_REL_ARM_BRANCH11:
950 case COFF::IMAGE_REL_ARM_BLX11:
954 case COFF::IMAGE_REL_ARM_BRANCH24:
955 case COFF::IMAGE_REL_ARM_BLX24:
956 case COFF::IMAGE_REL_ARM_MOV32A:
964 case COFF::IMAGE_REL_ARM_MOV32T:
966 case COFF::IMAGE_REL_ARM_BRANCH20T:
967 case COFF::IMAGE_REL_ARM_BRANCH24T:
968 case COFF::IMAGE_REL_ARM_BLX23T:
984 if (Header.Machine == COFF::IMAGE_FILE_MACHINE_R4000 &&
985 (Reloc.Data.Type == COFF::IMAGE_REL_MIPS_REFHI ||
986 Reloc.Data.Type == COFF::IMAGE_REL_MIPS_SECRELHI)) {
990 RelocPair.Data.Type = COFF::IMAGE_REL_MIPS_PAIR;
1022 if (S->Name.size() > COFF::NameSize)
1025 if (S->Name.size() > COFF::NameSize)
1049 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE)
1080 ".llvm_addrsig", COFF::IMAGE_SCN_LNK_REMOVE);
1102 ".llvm.call-graph-profile", COFF::IMAGE_SCN_LNK_REMOVE);
1154 // Write a string table, which completes the entire COFF file.
1188 if ((Type >> COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)