Lines Matching defs:CP

155 // Take a CP and assign addresses and sizes to everything. Returns false if the
157 static bool layoutOptionalHeader(COFFParser &CP) {
158 if (!CP.isPE())
160 unsigned PEHeaderSize = CP.is64Bit() ? sizeof(object::pe32plus_header)
162 CP.Obj.Header.SizeOfOptionalHeader =
164 CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize;
194 // Take a CP and assign addresses and sizes to everything. Returns false if the
196 static bool layoutCOFF(COFFParser &CP) {
199 CP.SectionTableStart =
200 CP.getHeaderSize() + CP.Obj.Header.SizeOfOptionalHeader;
201 if (CP.isPE())
202 CP.SectionTableStart += DOSStubSize + sizeof(COFF::PEMagic);
203 CP.SectionTableSize = COFF::SectionSize * CP.Obj.Sections.size();
206 CP.SectionTableStart + CP.SectionTableSize;
208 for (COFFYAML::Section &S : CP.Obj.Sections) {
213 CP.StringsAndChecksums);
214 if (CP.StringsAndChecksums.hasChecksums() &&
215 CP.StringsAndChecksums.hasStrings())
221 for (COFFYAML::Section &S : CP.Obj.Sections) {
224 assert(CP.StringsAndChecksums.hasStrings() &&
228 toDebugS(S.DebugS, CP.StringsAndChecksums, CP.Allocator);
232 S.SectionData = CodeViewYAML::toDebugT(S.DebugT, CP.Allocator, S.Name);
235 S.SectionData = CodeViewYAML::toDebugT(S.DebugP, CP.Allocator, S.Name);
238 S.SectionData = CodeViewYAML::toDebugH(*S.DebugH, CP.Allocator);
246 CP.isPE() ? CP.getFileAlignment() : 4);
248 if (CP.isPE())
250 alignTo(S.Header.SizeOfRawData, CP.getFileAlignment());
273 for (std::vector<COFFYAML::Symbol>::iterator i = CP.Obj.Symbols.begin(),
274 e = CP.Obj.Symbols.end();
285 (i->File.size() + CP.getSymbolSize() - 1) / CP.getSymbolSize();
295 CP.Obj.Header.NumberOfSections = CP.Obj.Sections.size();
296 CP.Obj.Header.NumberOfSymbols = NumberOfSymbols;
297 if (NumberOfSymbols > 0 || CP.StringTable.size() > 4)
298 CP.Obj.Header.PointerToSymbolTable = SymbolTableStart;
300 CP.Obj.Header.PointerToSymbolTable = 0;
302 *reinterpret_cast<support::ulittle32_t *>(&CP.StringTable[0]) =
303 CP.StringTable.size();
343 static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic,
347 Header->SectionAlignment = CP.Obj.OptionalHeader->Header.SectionAlignment;
348 Header->FileAlignment = CP.Obj.OptionalHeader->Header.FileAlignment;
351 uint32_t SizeOfHeaders = alignTo(CP.SectionTableStart + CP.SectionTableSize,
355 for (const COFFYAML::Section &S : CP.Obj.Sections) {
373 CP.Obj.OptionalHeader->Header.AddressOfEntryPoint; // RVA
374 Header->ImageBase = CP.Obj.OptionalHeader->Header.ImageBase;
376 CP.Obj.OptionalHeader->Header.MajorOperatingSystemVersion;
378 CP.Obj.OptionalHeader->Header.MinorOperatingSystemVersion;
379 Header->MajorImageVersion = CP.Obj.OptionalHeader->Header.MajorImageVersion;
380 Header->MinorImageVersion = CP.Obj.OptionalHeader->Header.MinorImageVersion;
382 CP.Obj.OptionalHeader->Header.MajorSubsystemVersion;
384 CP.Obj.OptionalHeader->Header.MinorSubsystemVersion;
387 Header->Subsystem = CP.Obj.OptionalHeader->Header.Subsystem;
388 Header->DLLCharacteristics = CP.Obj.OptionalHeader->Header.DLLCharacteristics;
389 Header->SizeOfStackReserve = CP.Obj.OptionalHeader->Header.SizeOfStackReserve;
390 Header->SizeOfStackCommit = CP.Obj.OptionalHeader->Header.SizeOfStackCommit;
391 Header->SizeOfHeapReserve = CP.Obj.OptionalHeader->Header.SizeOfHeapReserve;
392 Header->SizeOfHeapCommit = CP.Obj.OptionalHeader->Header.SizeOfHeapCommit;
393 Header->NumberOfRvaAndSize = CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize;
397 static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
398 if (CP.isPE()) {
421 if (CP.useBigObj()) {
426 << binary_le(CP.Obj.Header.Machine)
427 << binary_le(CP.Obj.Header.TimeDateStamp);
430 << zeros(uint32_t(0)) << binary_le(CP.Obj.Header.NumberOfSections)
431 << binary_le(CP.Obj.Header.PointerToSymbolTable)
432 << binary_le(CP.Obj.Header.NumberOfSymbols);
434 OS << binary_le(CP.Obj.Header.Machine)
435 << binary_le(static_cast<int16_t>(CP.Obj.Header.NumberOfSections))
436 << binary_le(CP.Obj.Header.TimeDateStamp)
437 << binary_le(CP.Obj.Header.PointerToSymbolTable)
438 << binary_le(CP.Obj.Header.NumberOfSymbols)
439 << binary_le(CP.Obj.Header.SizeOfOptionalHeader)
440 << binary_le(CP.Obj.Header.Characteristics);
442 if (CP.isPE()) {
443 if (CP.is64Bit()) {
445 initializeOptionalHeader(CP, COFF::PE32Header::PE32_PLUS, &PEH);
450 initializeOptionalHeader(CP, COFF::PE32Header::PE32, &PEH);
454 for (uint32_t I = 0; I < CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize;
457 CP.Obj.OptionalHeader->DataDirectories;
458 uint32_t NumDataDir = std::size(CP.Obj.OptionalHeader->DataDirectories);
469 assert(OS.tell() == CP.SectionTableStart);
471 for (const COFFYAML::Section &S : CP.Obj.Sections) {
483 assert(OS.tell() == CP.SectionTableStart + CP.SectionTableSize);
487 for (const COFFYAML::Symbol &Sym : CP.Obj.Symbols) {
493 for (const COFFYAML::Section &S : CP.Obj.Sections) {
525 for (std::vector<COFFYAML::Symbol>::const_iterator i = CP.Obj.Symbols.begin(),
526 e = CP.Obj.Symbols.end();
530 if (CP.useBigObj())
543 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
551 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
557 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
560 unsigned SymbolSize = CP.getSymbolSize();
577 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
583 OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
588 if (CP.Obj.Header.PointerToSymbolTable)
589 OS.write(&CP.StringTable[0], CP.StringTable.size());
626 COFFParser CP(Doc, ErrHandler);
627 if (!CP.parse()) {
632 if (!layoutOptionalHeader(CP)) {
637 if (!layoutCOFF(CP)) {
641 if (!writeCOFF(CP, Out)) {