Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1275)

Side by Side Diff: runtime/vm/elfgen.h

Issue 12016026: Cleanup for arm and mips. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 kStrtab, // String table. 113 kStrtab, // String table.
114 kSymtab, // Symbol table. 114 kSymtab, // Symbol table.
115 kNumSections, // Num of section header entries in section header table. 115 kNumSections, // Num of section header entries in section header table.
116 116
117 // Various ELF constants. 117 // Various ELF constants.
118 kELFCLASS32 = 1, 118 kELFCLASS32 = 1,
119 kELFCLASS64 = 2, 119 kELFCLASS64 = 2,
120 kELFDATA2LSB = 1, 120 kELFDATA2LSB = 1,
121 kELFDATA2MSB = 2, 121 kELFDATA2MSB = 2,
122 kEM_386 = 3, 122 kEM_386 = 3,
123 kEM_MIPS = 8,
123 kEM_ARM = 40, 124 kEM_ARM = 40,
124 kEM_X86_64 = 62, 125 kEM_X86_64 = 62,
125 kEV_CURRENT = 1, 126 kEV_CURRENT = 1,
126 kET_EXEC = 2, // not used 127 kET_EXEC = 2, // not used
127 kET_DYN = 3, 128 kET_DYN = 3,
128 kSHT_PROGBITS = 1, 129 kSHT_PROGBITS = 1,
129 kSHT_SYMTAB = 2, 130 kSHT_SYMTAB = 2,
130 kSHT_STRTAB = 3, 131 kSHT_STRTAB = 3,
131 kSHF_WRITE = 1, // not used 132 kSHF_WRITE = 1, // not used
132 kSHF_ALLOC = 2, 133 kSHF_ALLOC = 2,
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 OS::SNPrint(end_name, sizeof(end_name), "%s_end", name); 330 OS::SNPrint(end_name, sizeof(end_name), "%s_end", name);
330 AddFunction(end_name, pc + size, 0); 331 AddFunction(end_name, pc + size, 0);
331 } 332 }
332 333
333 334
334 int ElfGen::AddFunction(const char* name, uword pc, intptr_t size) { 335 int ElfGen::AddFunction(const char* name, uword pc, intptr_t size) {
335 ASSERT(text_vma_ != 0); // code must have been added 336 ASSERT(text_vma_ != 0); // code must have been added
336 DebugInfo::ByteBuffer* symtab = &section_buf_[kSymtab]; 337 DebugInfo::ByteBuffer* symtab = &section_buf_[kSymtab];
337 const int beg = symtab->size(); 338 const int beg = symtab->size();
338 WriteInt(symtab, AddName(name)); // st_name 339 WriteInt(symtab, AddName(name)); // st_name
339 #if defined(TARGET_ARCH_X64) 340 #if defined(ARCH_IS_64_BIT)
340 WriteShort(symtab, (kSTB_LOCAL << 4) + kSTT_FUNC); // st_info + (st_other<<8) 341 WriteShort(symtab, (kSTB_LOCAL << 4) + kSTT_FUNC); // st_info + (st_other<<8)
341 WriteShort(symtab, kText); // st_shndx 342 WriteShort(symtab, kText); // st_shndx
342 #endif 343 #endif
343 WriteWord(symtab, pc); // st_value 344 WriteWord(symtab, pc); // st_value
344 WriteWord(symtab, size); // st_size 345 WriteWord(symtab, size); // st_size
345 #if defined(TARGET_ARCH_IA32) || \ 346 #if defined(ARCH_IS_32_BIT)
346 defined(TARGET_ARCH_ARM) || \
347 defined(TARGET_ARCH_MIPS)
348 // st_info + (st_other<<8) 347 // st_info + (st_other<<8)
349 WriteShort(symtab, (kSTB_EXPORTED << 4) + kSTT_FUNC); 348 WriteShort(symtab, (kSTB_EXPORTED << 4) + kSTT_FUNC);
350 WriteShort(symtab, kText); // st_shndx 349 WriteShort(symtab, kText); // st_shndx
351 #endif 350 #endif
352 ASSERT(symtab->size() - beg == kSymbolSize); 351 ASSERT(symtab->size() - beg == kSymbolSize);
353 return beg / kSymbolSize; // symbol index in symtab 352 return beg / kSymbolSize; // symbol index in symtab
354 } 353 }
355 354
356 355
357 bool ElfGen::WriteToFile(File* handle) { 356 bool ElfGen::WriteToFile(File* handle) {
(...skipping 20 matching lines...) Expand all
378 377
379 378
380 int ElfGen::AddName(const char* str) { 379 int ElfGen::AddName(const char* str) {
381 return AddString(&section_buf_[kStrtab], str); 380 return AddString(&section_buf_[kStrtab], str);
382 } 381 }
383 382
384 383
385 void ElfGen::AddELFHeader(int shoff) { 384 void ElfGen::AddELFHeader(int shoff) {
386 ASSERT(text_vma_ != 0); // Code must have been added. 385 ASSERT(text_vma_ != 0); // Code must have been added.
387 Write(&header_, kEI_MAG0_MAG3, 4); // EI_MAG0..EI_MAG3 386 Write(&header_, kEI_MAG0_MAG3, 4); // EI_MAG0..EI_MAG3
388 #if defined(TARGET_ARCH_IA32) || \ 387 #if defined(ARCH_IS_32_BIT)
389 defined(TARGET_ARCH_ARM) || \
390 defined(TARGET_ARCH_MIPS)
391 WriteByte(&header_, kELFCLASS32); // EI_CLASS 388 WriteByte(&header_, kELFCLASS32); // EI_CLASS
392 #elif defined(TARGET_ARCH_X64) 389 #elif defined(ARCH_IS_64_BIT)
393 WriteByte(&header_, kELFCLASS64); // EI_CLASS 390 WriteByte(&header_, kELFCLASS64); // EI_CLASS
391 #else
392 #error Unknown architecture.
394 #endif 393 #endif
395 WriteByte(&header_, kELFDATA2LSB); // EI_DATA 394 WriteByte(&header_, kELFDATA2LSB); // EI_DATA
396 WriteByte(&header_, kEV_CURRENT); // EI_VERSION 395 WriteByte(&header_, kEV_CURRENT); // EI_VERSION
397 WriteByte(&header_, 0); // EI_PAD 396 WriteByte(&header_, 0); // EI_PAD
398 WriteInt(&header_, 0); // EI_PAD 397 WriteInt(&header_, 0); // EI_PAD
399 WriteInt(&header_, 0); // EI_PAD 398 WriteInt(&header_, 0); // EI_PAD
400 WriteShort(&header_, kET_DYN); // e_type, fake a shared object. 399 WriteShort(&header_, kET_DYN); // e_type, fake a shared object.
401 #if defined(TARGET_ARCH_IA32) 400 #if defined(TARGET_ARCH_IA32)
402 WriteShort(&header_, kEM_386); // e_machine 401 WriteShort(&header_, kEM_386); // e_machine
403 #elif defined(TARGET_ARCH_X64) 402 #elif defined(TARGET_ARCH_X64)
404 WriteShort(&header_, kEM_X86_64); // e_machine 403 WriteShort(&header_, kEM_X86_64); // e_machine
405 #elif defined(TARGET_ARCH_ARM) 404 #elif defined(TARGET_ARCH_ARM)
406 WriteShort(&header_, kEM_ARM); // e_machine 405 WriteShort(&header_, kEM_ARM); // e_machine
406 #elif defined(TARGET_ARCH_MIPS)
407 WriteShort(&header_, kEM_MIPS); // e_machine
408 #else
409 #error Unknown architecture.
407 #endif 410 #endif
408 WriteInt(&header_, kEV_CURRENT); // e_version 411 WriteInt(&header_, kEV_CURRENT); // e_version
409 WriteWord(&header_, 0); // e_entry: none 412 WriteWord(&header_, 0); // e_entry: none
410 WriteWord(&header_, 0); // e_phoff: no program header table. 413 WriteWord(&header_, 0); // e_phoff: no program header table.
411 WriteWord(&header_, shoff); // e_shoff: section header table offset. 414 WriteWord(&header_, shoff); // e_shoff: section header table offset.
412 WriteInt(&header_, 0); // e_flags: no flags. 415 WriteInt(&header_, 0); // e_flags: no flags.
413 WriteShort(&header_, kELFHeaderSize); // e_ehsize: header size. 416 WriteShort(&header_, kELFHeaderSize); // e_ehsize: header size.
414 WriteShort(&header_, kProgramHeaderEntrySize); // e_phentsize 417 WriteShort(&header_, kProgramHeaderEntrySize); // e_phentsize
415 WriteShort(&header_, 0); // e_phnum: no entries program header table. 418 WriteShort(&header_, 0); // e_phnum: no entries program header table.
416 WriteShort(&header_, kSectionHeaderEntrySize); // e_shentsize 419 WriteShort(&header_, kSectionHeaderEntrySize); // e_shentsize
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 ASSERT(offset == shoff); 496 ASSERT(offset == shoff);
494 offset += (*writer)(handle, sheaders_); 497 offset += (*writer)(handle, sheaders_);
495 ASSERT(offset == shoff + kNumSections * kSectionHeaderEntrySize); 498 ASSERT(offset == shoff + kNumSections * kSectionHeaderEntrySize);
496 499
497 return true; 500 return true;
498 } 501 }
499 502
500 } // namespace dart 503 } // namespace dart
501 504
502 #endif // VM_ELFGEN_H_ 505 #endif // VM_ELFGEN_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698