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

Side by Side Diff: lib/CodeGen/ELFWriter.cpp

Issue 4295001: arm-mc-elf-s07-tew (Closed)
Patch Set: Created 10 years, 1 month 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
« no previous file with comments | « lib/CodeGen/ELFWriter.h ('k') | lib/Target/ARM/ARMELFWriterInfo.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===-- ELFWriter.cpp - Target-independent ELF Writer code ----------------===// 1 //===-- ELFWriter.cpp - Target-independent ELF Writer code ----------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file implements the target-independent ELF writer. This file writes out 10 // This file implements the target-independent ELF writer. This file writes out
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 is64Bit(TM.getTargetData()->getPointerSizeInBits() == 64), 69 is64Bit(TM.getTargetData()->getPointerSizeInBits() == 64),
70 isLittleEndian(TM.getTargetData()->isLittleEndian()), 70 isLittleEndian(TM.getTargetData()->isLittleEndian()),
71 ElfHdr(isLittleEndian, is64Bit) { 71 ElfHdr(isLittleEndian, is64Bit) {
72 72
73 MAI = TM.getMCAsmInfo(); 73 MAI = TM.getMCAsmInfo();
74 TEW = TM.getELFWriterInfo(); 74 TEW = TM.getELFWriterInfo();
75 75
76 // Create the object code emitter object for this target. 76 // Create the object code emitter object for this target.
77 ElfCE = new ELFCodeEmitter(*this); 77 ElfCE = new ELFCodeEmitter(*this);
78 78
79 // Create the arch-specific relocation helper
80 TERH = TEW->getRelocHelper();
81
79 // Inital number of sections 82 // Inital number of sections
80 NumSections = 0; 83 NumSections = 0;
81 } 84 }
82 85
83 ELFWriter::~ELFWriter() { 86 ELFWriter::~ELFWriter() {
84 delete ElfCE; 87 delete ElfCE;
85 delete &OutContext; 88 delete &OutContext;
86 89
87 while(!SymbolList.empty()) { 90 while(!SymbolList.empty()) {
88 delete SymbolList.back(); 91 delete SymbolList.back();
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 717
715 // Dump the sections and section table to the .o file. 718 // Dump the sections and section table to the .o file.
716 OutputSectionsAndSectionTable(); 719 OutputSectionsAndSectionTable();
717 720
718 return false; 721 return false;
719 } 722 }
720 723
721 // RelocateField - Patch relocatable field with 'Offset' in 'BO' 724 // RelocateField - Patch relocatable field with 'Offset' in 'BO'
722 // using a 'Value' of known 'Size' 725 // using a 'Value' of known 'Size'
723 void ELFWriter::RelocateField(BinaryObject &BO, uint32_t Offset, 726 void ELFWriter::RelocateField(BinaryObject &BO, uint32_t Offset,
724 int64_t Value, unsigned Size) { 727 int64_t Value, unsigned Size,
728 const MachineRelocation &MR) {
725 if (Size == 32) 729 if (Size == 32)
726 BO.fixWord32(Value, Offset); 730 BO.fixWord32(Value, Offset);
727 else if (Size == 64) 731 else if (Size == 64)
728 BO.fixWord64(Value, Offset); 732 BO.fixWord64(Value, Offset);
729 else 733 else {
730 llvm_unreachable("don't know howto patch relocatable field"); 734 TERH->RelocateField(BO, Offset, Value, Size, MR);
735 }
731 } 736 }
732 737
733 /// EmitRelocations - Emit relocations 738 /// EmitRelocations - Emit relocations
734 void ELFWriter::EmitRelocations() { 739 void ELFWriter::EmitRelocations() {
735 740
736 // True if the target uses the relocation entry to hold the addend, 741 // True if the target uses the relocation entry to hold the addend,
737 // otherwise the addend is written directly to the relocatable field. 742 // otherwise the addend is written directly to the relocatable field.
738 bool HasRelA = TEW->hasRelocationAddend(); 743 bool HasRelA = TEW->hasRelocationAddend();
739 744
740 // Create Relocation sections for each section which needs it. 745 // Create Relocation sections for each section which needs it.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 SymIdx = SectionList[SectionIdx]->getSymbolTableIndex(); 799 SymIdx = SectionList[SectionIdx]->getSymbolTableIndex();
795 800
796 // The symbol offset inside the section 801 // The symbol offset inside the section
797 int64_t SymOffset = (int64_t)MR.getResultPointer(); 802 int64_t SymOffset = (int64_t)MR.getResultPointer();
798 803
799 // For pc relative relocations where symbols are defined in the same 804 // For pc relative relocations where symbols are defined in the same
800 // section they are referenced, ignore the relocation entry and patch 805 // section they are referenced, ignore the relocation entry and patch
801 // the relocatable field with the symbol offset directly. 806 // the relocatable field with the symbol offset directly.
802 if (S.SectionIdx == SectionIdx && TEW->isPCRelativeRel(RelType)) { 807 if (S.SectionIdx == SectionIdx && TEW->isPCRelativeRel(RelType)) {
803 int64_t Value = TEW->computeRelocation(SymOffset, RelOffset, RelType); 808 int64_t Value = TEW->computeRelocation(SymOffset, RelOffset, RelType);
804 RelocateField(S, RelOffset, Value, RelTySize); 809 RelocateField(S, RelOffset, Value, RelTySize, MR);
805 continue; 810 continue;
806 } 811 }
807 812
808 Addend = TEW->getDefaultAddendForRelTy(RelType, SymOffset); 813 Addend = TEW->getDefaultAddendForRelTy(RelType, SymOffset);
809 } 814 }
810 815
811 // The target without addend on the relocation symbol must be 816 // The target without addend on the relocation symbol must be
812 // patched in the relocation place itself to contain the addend 817 // patched in the relocation place itself to contain the addend
813 // otherwise write zeros to make sure there is no garbage there 818 // otherwise write zeros to make sure there is no garbage there
814 RelocateField(S, RelOffset, HasRelA ? 0 : Addend, RelTySize); 819 RelocateField(S, RelOffset, HasRelA ? 0 : Addend, RelTySize, MR);
815 820
816 // Get the relocation entry and emit to the relocation section 821 // Get the relocation entry and emit to the relocation section
817 ELFRelocation Rel(RelOffset, SymIdx, RelType, HasRelA, Addend); 822 ELFRelocation Rel(RelOffset, SymIdx, RelType, HasRelA, Addend);
818 EmitRelocation(RelSec, Rel, HasRelA); 823 EmitRelocation(RelSec, Rel, HasRelA);
819 } 824 }
820 } 825 }
821 } 826 }
822 827
823 /// EmitRelocation - Write relocation 'Rel' to the relocation section 'Rel' 828 /// EmitRelocation - Write relocation 'Rel' to the relocation section 'Rel'
824 void ELFWriter::EmitRelocation(BinaryObject &RelSec, ELFRelocation &Rel, 829 void ELFWriter::EmitRelocation(BinaryObject &RelSec, ELFRelocation &Rel,
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 } 1086 }
1082 1087
1083 // Align output for the section table. 1088 // Align output for the section table.
1084 for (size_t NewFileOff = (FileOff+TableAlign-1) & ~(TableAlign-1); 1089 for (size_t NewFileOff = (FileOff+TableAlign-1) & ~(TableAlign-1);
1085 FileOff != NewFileOff; ++FileOff) 1090 FileOff != NewFileOff; ++FileOff)
1086 O << (char)0xAB; 1091 O << (char)0xAB;
1087 1092
1088 // Emit the section table itself. 1093 // Emit the section table itself.
1089 O.write((char *)&SHdrTable.getData()[0], SHdrTable.size()); 1094 O.write((char *)&SHdrTable.getData()[0], SHdrTable.size());
1090 } 1095 }
OLDNEW
« no previous file with comments | « lib/CodeGen/ELFWriter.h ('k') | lib/Target/ARM/ARMELFWriterInfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698