Lines Matching full:cp

149 // Take a CP and assign addresses and sizes to everything. Returns false if the
151 static bool layoutOptionalHeader(COFFParser &CP) {
152 if (!CP.isPE())
154 unsigned PEHeaderSize = CP.is64Bit() ? sizeof(object::pe32plus_header)
156 CP.Obj.Header.SizeOfOptionalHeader =
158 CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize;
188 // Take a CP and assign addresses and sizes to everything. Returns false if the
190 static bool layoutCOFF(COFFParser &CP) {
193 CP.SectionTableStart =
194 CP.getHeaderSize() + CP.Obj.Header.SizeOfOptionalHeader;
195 if (CP.isPE())
196 CP.SectionTableStart += DOSStubSize + sizeof(COFF::PEMagic);
197 CP.SectionTableSize = COFF::SectionSize * CP.Obj.Sections.size();
200 CP.SectionTableStart + CP.SectionTableSize;
202 for (COFFYAML::Section &S : CP.Obj.Sections) {
207 CP.StringsAndChecksums);
208 if (CP.StringsAndChecksums.hasChecksums() &&
209 CP.StringsAndChecksums.hasStrings())
215 for (COFFYAML::Section &S : CP.Obj.Sections) {
218 assert(CP.StringsAndChecksums.hasStrings() &&
222 toDebugS(S.DebugS, CP.StringsAndChecksums, CP.Allocator);
226 S.SectionData = CodeViewYAML::toDebugT(S.DebugT, CP.Allocator, S.Name);
229 S.SectionData = CodeViewYAML::toDebugT(S.DebugP, CP.Allocator, S.Name);
232 S.SectionData = CodeViewYAML::toDebugH(*S.DebugH, CP.Allocator);
240 CP.isPE() ? CP.getFileAlignment() : 4);
242 if (CP.isPE())
244 alignTo(S.Header.SizeOfRawData, CP.getFileAlignment());
267 for (std::vector<COFFYAML::Symbol>::iterator i = CP.Obj.Symbols.begin(),
268 e = CP.Obj.Symbols.end();
279 (i->File.size() + CP.getSymbolSize() - 1) / CP.getSymbolSize();
289 CP.Obj.Header.NumberOfSections = CP.Obj.Sections.size();
290 CP.Obj.Header.NumberOfSymbols = NumberOfSymbols;
291 if (NumberOfSymbols > 0 || CP.StringTable.size() > 4)
292 CP.Obj.Header.PointerToSymbolTable = SymbolTableStart;
294 CP.Obj.Header.PointerToSymbolTable = 0;
296 *reinterpret_cast<support::ulittle32_t *>(&CP.StringTable[0]) =
297 CP.StringTable.size();
337 static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic,
341 Header->SectionAlignment = CP.Obj.OptionalHeader->Header.SectionAlignment;
342 Header->FileAlignment = CP.Obj.OptionalHeader->Header.FileAlignment;
345 uint32_t SizeOfHeaders = alignTo(CP.SectionTableStart + CP.SectionTableSize,
349 for (const COFFYAML::Section &S : CP.Obj.Sections) {
367 CP.Obj.OptionalHeader->Header.AddressOfEntryPoint; // RVA
368 Header->ImageBase = CP.Obj.OptionalHeader->Header.ImageBase;
370 CP.Obj.OptionalHeader->Header.MajorOperatingSystemVersion;
372 CP.Obj.OptionalHeader->Header.MinorOperatingSystemVersion;
373 Header->MajorImageVersion = CP.Obj.OptionalHeader->Header.MajorImageVersion;
374 Header->MinorImageVersion = CP.Obj.OptionalHeader->Header.MinorImageVersion;
376 CP.Obj.OptionalHeader->Header.MajorSubsystemVersion;
378 CP.Obj.OptionalHeader->Header.MinorSubsystemVersion;
381 Header->Subsystem = CP.Obj.OptionalHeader->Header.Subsystem;
382 Header->DLLCharacteristics = CP.Obj.OptionalHeader->Header.DLLCharacteristics;
383 Header->SizeOfStackReserve = CP.Obj.OptionalHeader->Header.SizeOfStackReserve;
384 Header->SizeOfStackCommit = CP.Obj.OptionalHeader->Header.SizeOfStackCommit;
385 Header->SizeOfHeapReserve = CP.Obj.OptionalHeader->Header.SizeOfHeapReserve;
386 Header->SizeOfHeapCommit = CP.Obj.OptionalHeader->Header.SizeOfHeapCommit;
387 Header->NumberOfRvaAndSize = CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize;
391 static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
392 if (CP.isPE()) {
415 if (CP.useBigObj()) {
420 << binary_le(CP.Obj.Header.Machine)
421 << binary_le(CP.Obj.Header.TimeDateStamp);
424 << zeros(uint32_t(0)) << binary_le(CP.Obj.Header.NumberOfSections)
425 << binary_le(CP.Obj.Header.PointerToSymbolTable)
426 << binary_le(CP.Obj.Header.NumberOfSymbols);
428 OS << binary_le(CP.Obj.Header.Machine)
429 << binary_le(static_cast<int16_t>(CP.Obj.Header.NumberOfSections))
430 << binary_le(CP.Obj.Header.TimeDateStamp)
431 << binary_le(CP.Obj.Header.PointerToSymbolTable)
432 << binary_le(CP.Obj.Header.NumberOfSymbols)
433 << binary_le(CP.Obj.Header.SizeOfOptionalHeader)
434 << binary_le(CP.Obj.Header.Characteristics);
436 if (CP.isPE()) {
437 if (CP.is64Bit()) {
439 initializeOptionalHeader(CP, COFF::PE32Header::PE32_PLUS, &PEH);
444 initializeOptionalHeader(CP, COFF::PE32Header::PE32, &PEH);
448 for (uint32_t I = 0; I < CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize;
451 CP.Obj.OptionalHeader->DataDirectories;
452 uint32_t NumDataDir = std::size(CP.Obj.OptionalHeader->DataDirectories);
463 assert(OS.tell() == CP.SectionTableStart);
465 for (const COFFYAML::Section &S : CP.Obj.Sections) {
477 assert(OS.tell() == CP.SectionTableStart + CP.SectionTableSize);
481 for (const COFFYAML::Symbol &Sym : CP.Obj.Symbols) {
487 for (const COFFYAML::Section &S : CP.Obj.Sections) {
519 for (std::vector<COFFYAML::Symbol>::const_iterator i = CP.Obj.Symbols.begin(),
520 e = CP.Obj.Symbols.end();
524 if (CP.useBigObj())
537 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
545 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
551 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
554 unsigned SymbolSize = CP.getSymbolSize();
571 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
577 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
582 if (CP.Obj.Header.PointerToSymbolTable)
583 OS.write(&CP.StringTable[0], CP.StringTable.size());
620 COFFParser CP(Doc, ErrHandler);
621 if (!CP.parse()) {
626 if (!layoutOptionalHeader(CP)) {
631 if (!layoutCOFF(CP)) {
635 if (!writeCOFF(CP, Out)) {