Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_ELFGEN_H_ | 5 #ifndef VM_ELFGEN_H_ |
| 6 #define VM_ELFGEN_H_ | 6 #define VM_ELFGEN_H_ |
| 7 | 7 |
| 8 #include "vm/thread.h" | 8 #include "vm/thread.h" |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 335 ASSERT(text_vma_ != 0); // code must have been added | 335 ASSERT(text_vma_ != 0); // code must have been added |
| 336 DebugInfo::ByteBuffer* symtab = §ion_buf_[kSymtab]; | 336 DebugInfo::ByteBuffer* symtab = §ion_buf_[kSymtab]; |
| 337 const int beg = symtab->size(); | 337 const int beg = symtab->size(); |
| 338 WriteInt(symtab, AddName(name)); // st_name | 338 WriteInt(symtab, AddName(name)); // st_name |
| 339 #if defined(TARGET_ARCH_X64) | 339 #if defined(TARGET_ARCH_X64) |
| 340 WriteShort(symtab, (kSTB_LOCAL << 4) + kSTT_FUNC); // st_info + (st_other<<8) | 340 WriteShort(symtab, (kSTB_LOCAL << 4) + kSTT_FUNC); // st_info + (st_other<<8) |
| 341 WriteShort(symtab, kText); // st_shndx | 341 WriteShort(symtab, kText); // st_shndx |
| 342 #endif | 342 #endif |
| 343 WriteWord(symtab, pc); // st_value | 343 WriteWord(symtab, pc); // st_value |
| 344 WriteWord(symtab, size); // st_size | 344 WriteWord(symtab, size); // st_size |
| 345 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM) | 345 #if defined(TARGET_ARCH_IA32) || \ |
|
Ivan Posva
2013/01/18 23:57:39
Should this be ARCH_IS_32_BIT and ARCH_IS_64_BIT,
regis
2013/01/19 00:17:34
Good point. I'll fix that in a later cl with other
| |
| 346 defined(TARGET_ARCH_ARM) || \ | |
| 347 defined(TARGET_ARCH_MIPS) | |
| 346 // st_info + (st_other<<8) | 348 // st_info + (st_other<<8) |
| 347 WriteShort(symtab, (kSTB_EXPORTED << 4) + kSTT_FUNC); | 349 WriteShort(symtab, (kSTB_EXPORTED << 4) + kSTT_FUNC); |
| 348 WriteShort(symtab, kText); // st_shndx | 350 WriteShort(symtab, kText); // st_shndx |
| 349 #endif | 351 #endif |
| 350 ASSERT(symtab->size() - beg == kSymbolSize); | 352 ASSERT(symtab->size() - beg == kSymbolSize); |
| 351 return beg / kSymbolSize; // symbol index in symtab | 353 return beg / kSymbolSize; // symbol index in symtab |
| 352 } | 354 } |
| 353 | 355 |
| 354 | 356 |
| 355 bool ElfGen::WriteToFile(File* handle) { | 357 bool ElfGen::WriteToFile(File* handle) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 376 | 378 |
| 377 | 379 |
| 378 int ElfGen::AddName(const char* str) { | 380 int ElfGen::AddName(const char* str) { |
| 379 return AddString(§ion_buf_[kStrtab], str); | 381 return AddString(§ion_buf_[kStrtab], str); |
| 380 } | 382 } |
| 381 | 383 |
| 382 | 384 |
| 383 void ElfGen::AddELFHeader(int shoff) { | 385 void ElfGen::AddELFHeader(int shoff) { |
| 384 ASSERT(text_vma_ != 0); // Code must have been added. | 386 ASSERT(text_vma_ != 0); // Code must have been added. |
| 385 Write(&header_, kEI_MAG0_MAG3, 4); // EI_MAG0..EI_MAG3 | 387 Write(&header_, kEI_MAG0_MAG3, 4); // EI_MAG0..EI_MAG3 |
| 386 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM) | 388 #if defined(TARGET_ARCH_IA32) || \ |
| 389 defined(TARGET_ARCH_ARM) || \ | |
| 390 defined(TARGET_ARCH_MIPS) | |
|
regis
2013/01/19 00:17:34
ditto
| |
| 387 WriteByte(&header_, kELFCLASS32); // EI_CLASS | 391 WriteByte(&header_, kELFCLASS32); // EI_CLASS |
| 388 #elif defined(TARGET_ARCH_X64) | 392 #elif defined(TARGET_ARCH_X64) |
| 389 WriteByte(&header_, kELFCLASS64); // EI_CLASS | 393 WriteByte(&header_, kELFCLASS64); // EI_CLASS |
| 390 #endif | 394 #endif |
| 391 WriteByte(&header_, kELFDATA2LSB); // EI_DATA | 395 WriteByte(&header_, kELFDATA2LSB); // EI_DATA |
| 392 WriteByte(&header_, kEV_CURRENT); // EI_VERSION | 396 WriteByte(&header_, kEV_CURRENT); // EI_VERSION |
| 393 WriteByte(&header_, 0); // EI_PAD | 397 WriteByte(&header_, 0); // EI_PAD |
| 394 WriteInt(&header_, 0); // EI_PAD | 398 WriteInt(&header_, 0); // EI_PAD |
| 395 WriteInt(&header_, 0); // EI_PAD | 399 WriteInt(&header_, 0); // EI_PAD |
| 396 WriteShort(&header_, kET_DYN); // e_type, fake a shared object. | 400 WriteShort(&header_, kET_DYN); // e_type, fake a shared object. |
| 397 #if defined(TARGET_ARCH_IA32) | 401 #if defined(TARGET_ARCH_IA32) |
| 398 WriteShort(&header_, kEM_386); // e_machine | 402 WriteShort(&header_, kEM_386); // e_machine |
| 399 #elif defined(TARGET_ARCH_X64) | 403 #elif defined(TARGET_ARCH_X64) |
| 400 WriteShort(&header_, kEM_X86_64); // e_machine | 404 WriteShort(&header_, kEM_X86_64); // e_machine |
| 401 #elif defined(TARGET_ARCH_ARM) | 405 #elif defined(TARGET_ARCH_ARM) |
| 402 WriteShort(&header_, kEM_ARM); // e_machine | 406 WriteShort(&header_, kEM_ARM); // e_machine |
| 403 #endif | 407 #endif |
|
regis
2013/01/19 00:17:34
I will handle MIPS here as well.
| |
| 404 WriteInt(&header_, kEV_CURRENT); // e_version | 408 WriteInt(&header_, kEV_CURRENT); // e_version |
| 405 WriteWord(&header_, 0); // e_entry: none | 409 WriteWord(&header_, 0); // e_entry: none |
| 406 WriteWord(&header_, 0); // e_phoff: no program header table. | 410 WriteWord(&header_, 0); // e_phoff: no program header table. |
| 407 WriteWord(&header_, shoff); // e_shoff: section header table offset. | 411 WriteWord(&header_, shoff); // e_shoff: section header table offset. |
| 408 WriteInt(&header_, 0); // e_flags: no flags. | 412 WriteInt(&header_, 0); // e_flags: no flags. |
| 409 WriteShort(&header_, kELFHeaderSize); // e_ehsize: header size. | 413 WriteShort(&header_, kELFHeaderSize); // e_ehsize: header size. |
| 410 WriteShort(&header_, kProgramHeaderEntrySize); // e_phentsize | 414 WriteShort(&header_, kProgramHeaderEntrySize); // e_phentsize |
| 411 WriteShort(&header_, 0); // e_phnum: no entries program header table. | 415 WriteShort(&header_, 0); // e_phnum: no entries program header table. |
| 412 WriteShort(&header_, kSectionHeaderEntrySize); // e_shentsize | 416 WriteShort(&header_, kSectionHeaderEntrySize); // e_shentsize |
| 413 // e_shnum: number of section header entries. | 417 // e_shnum: number of section header entries. |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 489 ASSERT(offset == shoff); | 493 ASSERT(offset == shoff); |
| 490 offset += (*writer)(handle, sheaders_); | 494 offset += (*writer)(handle, sheaders_); |
| 491 ASSERT(offset == shoff + kNumSections * kSectionHeaderEntrySize); | 495 ASSERT(offset == shoff + kNumSections * kSectionHeaderEntrySize); |
| 492 | 496 |
| 493 return true; | 497 return true; |
| 494 } | 498 } |
| 495 | 499 |
| 496 } // namespace dart | 500 } // namespace dart |
| 497 | 501 |
| 498 #endif // VM_ELFGEN_H_ | 502 #endif // VM_ELFGEN_H_ |
| OLD | NEW |