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

Side by Side Diff: src/IceELFSection.cpp

Issue 1838753002: Subzero: Remove IceString. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Code review changes Created 4 years, 8 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/IceELFSection.h ('k') | src/IceFixups.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 //===- subzero/src/IceELFSection.cpp - Representation of ELF sections -----===// 1 //===- subzero/src/IceELFSection.cpp - Representation of ELF sections -----===//
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 /// \file 10 /// \file
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 87 }
88 } 88 }
89 } 89 }
90 90
91 size_t ELFRelocationSection::getSectionDataSize() const { 91 size_t ELFRelocationSection::getSectionDataSize() const {
92 return Fixups.size() * Header.sh_entsize; 92 return Fixups.size() * Header.sh_entsize;
93 } 93 }
94 94
95 // Symbol tables. 95 // Symbol tables.
96 96
97 void ELFSymbolTableSection::createNullSymbol(ELFSection *NullSection) { 97 void ELFSymbolTableSection::createNullSymbol(ELFSection *NullSection,
98 GlobalContext *Ctx) {
98 // The first entry in the symbol table should be a NULL entry, so make sure 99 // The first entry in the symbol table should be a NULL entry, so make sure
99 // the map is still empty. 100 // the map is still empty.
100 assert(LocalSymbols.empty()); 101 assert(LocalSymbols.empty());
101 const IceString NullSymName(""); 102 // Explicitly set the null symbol name to the empty string, so that
102 createDefinedSym(NullSymName, STT_NOTYPE, STB_LOCAL, NullSection, 0, 0); 103 // GlobalString::operator<() orders the null string first.
103 NullSymbol = findSymbol(NullSymName); 104 NullSymbolName = GlobalString::createWithString(Ctx, "");
105 createDefinedSym(NullSymbolName, STT_NOTYPE, STB_LOCAL, NullSection, 0, 0);
106 NullSymbol = findSymbol(NullSymbolName);
104 } 107 }
105 108
106 void ELFSymbolTableSection::createDefinedSym(const IceString &Name, 109 void ELFSymbolTableSection::createDefinedSym(GlobalString Name, uint8_t Type,
107 uint8_t Type, uint8_t Binding, 110 uint8_t Binding,
108 ELFSection *Section, 111 ELFSection *Section,
109 RelocOffsetT Offset, SizeT Size) { 112 RelocOffsetT Offset, SizeT Size) {
110 ELFSym NewSymbol = ELFSym(); 113 ELFSym NewSymbol = ELFSym();
111 NewSymbol.Sym.setBindingAndType(Binding, Type); 114 NewSymbol.Sym.setBindingAndType(Binding, Type);
112 NewSymbol.Sym.st_value = Offset; 115 NewSymbol.Sym.st_value = Offset;
113 NewSymbol.Sym.st_size = Size; 116 NewSymbol.Sym.st_size = Size;
114 NewSymbol.Section = Section; 117 NewSymbol.Section = Section;
115 NewSymbol.Number = ELFSym::UnknownNumber; 118 NewSymbol.Number = ELFSym::UnknownNumber;
116 bool Unique; 119 bool Unique;
117 if (Binding == STB_LOCAL) 120 if (Binding == STB_LOCAL)
118 Unique = LocalSymbols.insert(std::make_pair(Name, NewSymbol)).second; 121 Unique = LocalSymbols.insert(std::make_pair(Name, NewSymbol)).second;
119 else 122 else
120 Unique = GlobalSymbols.insert(std::make_pair(Name, NewSymbol)).second; 123 Unique = GlobalSymbols.insert(std::make_pair(Name, NewSymbol)).second;
121 assert(Unique); 124 assert(Unique);
122 (void)Unique; 125 (void)Unique;
123 } 126 }
124 127
125 void ELFSymbolTableSection::noteUndefinedSym(const IceString &Name, 128 void ELFSymbolTableSection::noteUndefinedSym(GlobalString Name,
126 ELFSection *NullSection) { 129 ELFSection *NullSection) {
127 ELFSym NewSymbol = ELFSym(); 130 ELFSym NewSymbol = ELFSym();
128 NewSymbol.Sym.setBindingAndType(STB_GLOBAL, STT_NOTYPE); 131 NewSymbol.Sym.setBindingAndType(STB_GLOBAL, STT_NOTYPE);
129 NewSymbol.Section = NullSection; 132 NewSymbol.Section = NullSection;
130 NewSymbol.Number = ELFSym::UnknownNumber; 133 NewSymbol.Number = ELFSym::UnknownNumber;
131 bool Unique = GlobalSymbols.insert(std::make_pair(Name, NewSymbol)).second; 134 bool Unique = GlobalSymbols.insert(std::make_pair(Name, NewSymbol)).second;
132 if (!Unique) { 135 if (!Unique) {
133 std::string Buffer; 136 std::string Buffer;
134 llvm::raw_string_ostream StrBuf(Buffer); 137 llvm::raw_string_ostream StrBuf(Buffer);
135 StrBuf << "Symbol external and defined: " << Name; 138 StrBuf << "Symbol external and defined: " << Name;
136 llvm::report_fatal_error(StrBuf.str()); 139 llvm::report_fatal_error(StrBuf.str());
137 } 140 }
138 (void)Unique; 141 (void)Unique;
139 } 142 }
140 143
141 const ELFSym *ELFSymbolTableSection::findSymbol(const IceString &Name) const { 144 const ELFSym *ELFSymbolTableSection::findSymbol(GlobalString Name) const {
142 auto I = LocalSymbols.find(Name); 145 auto I = LocalSymbols.find(Name);
143 if (I != LocalSymbols.end()) 146 if (I != LocalSymbols.end())
144 return &I->second; 147 return &I->second;
145 I = GlobalSymbols.find(Name); 148 I = GlobalSymbols.find(Name);
146 if (I != GlobalSymbols.end()) 149 if (I != GlobalSymbols.end())
147 return &I->second; 150 return &I->second;
148 return nullptr; 151 return nullptr;
149 } 152 }
150 153
151 void ELFSymbolTableSection::updateIndices(const ELFStringTableSection *StrTab) { 154 void ELFSymbolTableSection::updateIndices(const ELFStringTableSection *StrTab) {
152 SizeT SymNumber = 0; 155 SizeT SymNumber = 0;
153 for (auto &KeyValue : LocalSymbols) { 156 for (auto &KeyValue : LocalSymbols) {
154 const IceString &Name = KeyValue.first; 157 GlobalString Name = KeyValue.first;
155 ELFSection *Section = KeyValue.second.Section; 158 ELFSection *Section = KeyValue.second.Section;
156 Elf64_Sym &SymInfo = KeyValue.second.Sym; 159 Elf64_Sym &SymInfo = KeyValue.second.Sym;
157 if (!Name.empty()) 160 if (Name != NullSymbolName && Name.hasStdString())
158 SymInfo.st_name = StrTab->getIndex(Name); 161 SymInfo.st_name = StrTab->getIndex(Name.toString());
159 SymInfo.st_shndx = Section->getNumber(); 162 SymInfo.st_shndx = Section->getNumber();
160 KeyValue.second.setNumber(SymNumber++); 163 KeyValue.second.setNumber(SymNumber++);
161 } 164 }
162 for (auto &KeyValue : GlobalSymbols) { 165 for (auto &KeyValue : GlobalSymbols) {
163 const IceString &Name = KeyValue.first; 166 const std::string &Name = KeyValue.first.toString();
164 ELFSection *Section = KeyValue.second.Section; 167 ELFSection *Section = KeyValue.second.Section;
165 Elf64_Sym &SymInfo = KeyValue.second.Sym; 168 Elf64_Sym &SymInfo = KeyValue.second.Sym;
166 if (!Name.empty()) 169 if (!Name.empty())
167 SymInfo.st_name = StrTab->getIndex(Name); 170 SymInfo.st_name = StrTab->getIndex(Name);
168 SymInfo.st_shndx = Section->getNumber(); 171 SymInfo.st_shndx = Section->getNumber();
169 KeyValue.second.setNumber(SymNumber++); 172 KeyValue.second.setNumber(SymNumber++);
170 } 173 }
171 } 174 }
172 175
173 void ELFSymbolTableSection::writeData(ELFStreamer &Str, bool IsELF64) { 176 void ELFSymbolTableSection::writeData(ELFStreamer &Str, bool IsELF64) {
174 if (IsELF64) { 177 if (IsELF64) {
175 writeSymbolMap<true>(Str, LocalSymbols); 178 writeSymbolMap<true>(Str, LocalSymbols);
176 writeSymbolMap<true>(Str, GlobalSymbols); 179 writeSymbolMap<true>(Str, GlobalSymbols);
177 } else { 180 } else {
178 writeSymbolMap<false>(Str, LocalSymbols); 181 writeSymbolMap<false>(Str, LocalSymbols);
179 writeSymbolMap<false>(Str, GlobalSymbols); 182 writeSymbolMap<false>(Str, GlobalSymbols);
180 } 183 }
181 } 184 }
182 185
183 // String tables. 186 // String tables.
184 187
185 void ELFStringTableSection::add(const IceString &Str) { 188 void ELFStringTableSection::add(const std::string &Str) {
186 assert(!isLaidOut()); 189 assert(!isLaidOut());
187 assert(!Str.empty()); 190 assert(!Str.empty());
188 StringToIndexMap.insert(std::make_pair(Str, UnknownIndex)); 191 StringToIndexMap.insert(std::make_pair(Str, UnknownIndex));
189 } 192 }
190 193
191 size_t ELFStringTableSection::getIndex(const IceString &Str) const { 194 size_t ELFStringTableSection::getIndex(const std::string &Str) const {
192 assert(isLaidOut()); 195 assert(isLaidOut());
193 StringToIndexType::const_iterator It = StringToIndexMap.find(Str); 196 StringToIndexType::const_iterator It = StringToIndexMap.find(Str);
194 if (It == StringToIndexMap.end()) { 197 if (It == StringToIndexMap.end()) {
195 llvm_unreachable("String index not found"); 198 llvm::report_fatal_error("String index not found: " + Str);
196 return UnknownIndex; 199 return UnknownIndex;
197 } 200 }
198 return It->second; 201 return It->second;
199 } 202 }
200 203
201 bool ELFStringTableSection::SuffixComparator:: 204 bool ELFStringTableSection::SuffixComparator::
202 operator()(const IceString &StrA, const IceString &StrB) const { 205 operator()(const std::string &StrA, const std::string &StrB) const {
203 size_t LenA = StrA.size(); 206 size_t LenA = StrA.size();
204 size_t LenB = StrB.size(); 207 size_t LenB = StrB.size();
205 size_t CommonLen = std::min(LenA, LenB); 208 size_t CommonLen = std::min(LenA, LenB);
206 // If there is a difference in the common suffix, use that diff to sort. 209 // If there is a difference in the common suffix, use that diff to sort.
207 for (size_t i = 0; i < CommonLen; ++i) { 210 for (size_t i = 0; i < CommonLen; ++i) {
208 char a = StrA[LenA - i - 1]; 211 char a = StrA[LenA - i - 1];
209 char b = StrB[LenB - i - 1]; 212 char b = StrB[LenB - i - 1];
210 if (a != b) 213 if (a != b)
211 return a > b; 214 return a > b;
212 } 215 }
(...skipping 19 matching lines...) Expand all
232 continue; 235 continue;
233 } 236 }
234 StringIndex.second = StringData.size(); 237 StringIndex.second = StringData.size();
235 std::copy(Cur.begin(), Cur.end(), back_inserter(StringData)); 238 std::copy(Cur.begin(), Cur.end(), back_inserter(StringData));
236 StringData.push_back(0); 239 StringData.push_back(0);
237 Prev = Cur; 240 Prev = Cur;
238 } 241 }
239 } 242 }
240 243
241 } // end of namespace Ice 244 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceELFSection.h ('k') | src/IceFixups.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698