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

Side by Side Diff: src/IceELFObjectWriter.h

Issue 828873002: Subzero: Start writing out some relocation sections (text) (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: review fixes Created 5 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
« no previous file with comments | « src/IceDefs.h ('k') | src/IceELFObjectWriter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceELFObjectWriter.h - ELF object writer -----*- C++ -*-===// 1 //===- subzero/src/IceELFObjectWriter.h - ELF object writer -----*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
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 // Abstraction for a writer that is responsible for writing an ELF file. 10 // Abstraction for a writer that is responsible for writing an ELF file.
(...skipping 29 matching lines...) Expand all
40 public: 40 public:
41 ELFObjectWriter(GlobalContext &Ctx, ELFStreamer &Out); 41 ELFObjectWriter(GlobalContext &Ctx, ELFStreamer &Out);
42 42
43 // Write the initial ELF header. This is just to reserve space in the ELF 43 // Write the initial ELF header. This is just to reserve space in the ELF
44 // file. Reserving space allows the other functions to write text 44 // file. Reserving space allows the other functions to write text
45 // and data directly to the file and get the right file offsets. 45 // and data directly to the file and get the right file offsets.
46 void writeInitialELFHeader(); 46 void writeInitialELFHeader();
47 47
48 // Copy data of a function's text section to file and note the offset of the 48 // Copy data of a function's text section to file and note the offset of the
49 // symbol's definition in the symbol table. 49 // symbol's definition in the symbol table.
50 // TODO(jvoung): This also needs the relocations to adjust the 50 // Copy the text fixups for use after all functions are written.
51 // section-relative offsets and hook them up to the symbol table references.
52 void writeFunctionCode(const IceString &FuncName, bool IsInternal, 51 void writeFunctionCode(const IceString &FuncName, bool IsInternal,
53 const llvm::StringRef Data); 52 const Assembler *Asm);
54 53
55 // Copy initializer data for a global to file and note the offset and 54 // Copy initializer data for a global to file and note the offset and
56 // size of the global's definition in the symbol table. 55 // size of the global's definition in the symbol table.
57 // TODO(jvoung): This needs to know which section. This also needs the 56 // TODO(jvoung): This needs to know which section. This also needs the
58 // relocations to hook them up to the symbol table references. Also 57 // relocations to hook them up to the symbol table references. Also
59 // TODO is handling BSS (which just needs to note the size). 58 // TODO is handling BSS (which just needs to note the size).
60 void writeDataInitializer(const IceString &VarName, 59 void writeDataInitializer(const IceString &VarName,
61 const llvm::StringRef Data); 60 const llvm::StringRef Data);
62 61
63 template <typename ConstType> void writeConstantPool(Type Ty); 62 template <typename ConstType> void writeConstantPool(Type Ty);
64 63
65 // Do final layout and write out the rest of the object file, then 64 // Do final layout and write out the rest of the object file, then
66 // patch up the initial ELF header with the final info. 65 // patch up the initial ELF header with the final info.
67 void writeNonUserSections(); 66 void writeNonUserSections();
68 67
69 private: 68 private:
70 GlobalContext &Ctx; 69 GlobalContext &Ctx;
71 ELFStreamer &Str; 70 ELFStreamer &Str;
72 bool SectionNumbersAssigned; 71 bool SectionNumbersAssigned;
73 72
74 // All created sections, separated into different pools. 73 // All created sections, separated into different pools.
75 typedef std::vector<ELFSection *> SectionList; 74 typedef std::vector<ELFSection *> SectionList;
76 typedef std::vector<ELFTextSection *> TextSectionList; 75 typedef std::vector<ELFTextSection *> TextSectionList;
77 typedef std::vector<ELFDataSection *> DataSectionList; 76 typedef std::vector<ELFDataSection *> DataSectionList;
78 typedef std::vector<ELFRelocationSectionBase *> RelSectionList; 77 typedef std::vector<ELFRelocationSection *> RelSectionList;
79 TextSectionList TextSections; 78 TextSectionList TextSections;
80 RelSectionList RelTextSections; 79 RelSectionList RelTextSections;
81 DataSectionList DataSections; 80 DataSectionList DataSections;
82 RelSectionList RelDataSections; 81 RelSectionList RelDataSections;
83 DataSectionList RoDataSections; 82 DataSectionList RoDataSections;
84 RelSectionList RelRoDataSections; 83 RelSectionList RelRoDataSections;
85 84
86 // Handles to special sections that need incremental bookkeeping. 85 // Handles to special sections that need incremental bookkeeping.
87 ELFSection *NullSection; 86 ELFSection *NullSection;
88 ELFStringTableSection *ShStrTab; 87 ELFStringTableSection *ShStrTab;
(...skipping 21 matching lines...) Expand all
110 // section's number. 109 // section's number.
111 template <typename UserSectionList> 110 template <typename UserSectionList>
112 void assignRelSectionNumInPairs(SizeT &CurSectionNumber, 111 void assignRelSectionNumInPairs(SizeT &CurSectionNumber,
113 UserSectionList &UserSections, 112 UserSectionList &UserSections,
114 RelSectionList &RelSections, 113 RelSectionList &RelSections,
115 SectionList &AllSections); 114 SectionList &AllSections);
116 115
117 // Link the relocation sections to the symbol table. 116 // Link the relocation sections to the symbol table.
118 void assignRelLinkNum(SizeT SymTabNumber, RelSectionList &RelSections); 117 void assignRelLinkNum(SizeT SymTabNumber, RelSectionList &RelSections);
119 118
119 // Write the final relocation sections given the final symbol table.
120 // May also be able to seek around the file and resolve function calls
121 // that are for functions within the same section.
122 void writeAllRelocationSections(bool IsELF64);
123 void writeRelocationSections(bool IsELF64, RelSectionList &RelSections);
124
120 // Write the ELF file header with the given information about sections. 125 // Write the ELF file header with the given information about sections.
121 template <bool IsELF64> 126 template <bool IsELF64>
122 void writeELFHeaderInternal(Elf64_Off SectionHeaderOffset, 127 void writeELFHeaderInternal(Elf64_Off SectionHeaderOffset,
123 SizeT SectHeaderStrIndex, SizeT NumSections); 128 SizeT SectHeaderStrIndex, SizeT NumSections);
124 }; 129 };
125 130
126 } // end of namespace Ice 131 } // end of namespace Ice
127 132
128 #endif // SUBZERO_SRC_ICEELFOBJECTWRITER_H 133 #endif // SUBZERO_SRC_ICEELFOBJECTWRITER_H
OLDNEW
« no previous file with comments | « src/IceDefs.h ('k') | src/IceELFObjectWriter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698