| OLD | NEW |
| 1 //===- subzero/src/IceELFObjectWriter.cpp - ELF object file writer --------===// | 1 //===- subzero/src/IceELFObjectWriter.cpp - ELF object file writer --------===// |
| 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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 if (AlignDiff == 0) | 212 if (AlignDiff == 0) |
| 213 return OffsetInFile; | 213 return OffsetInFile; |
| 214 Str.writeZeroPadding(AlignDiff); | 214 Str.writeZeroPadding(AlignDiff); |
| 215 OffsetInFile += AlignDiff; | 215 OffsetInFile += AlignDiff; |
| 216 return OffsetInFile; | 216 return OffsetInFile; |
| 217 } | 217 } |
| 218 | 218 |
| 219 void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, | 219 void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
| 220 bool IsInternal, Assembler *Asm) { | 220 bool IsInternal, Assembler *Asm) { |
| 221 assert(!SectionNumbersAssigned); | 221 assert(!SectionNumbersAssigned); |
| 222 TimerMarker T_func(&Ctx, FuncName); |
| 222 TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); | 223 TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
| 223 constexpr TimerStackIdT StackID = GlobalContext::TSK_Funcs; | |
| 224 TimerIdT TimerID = 0; | |
| 225 bool TimeThisFunction = Ctx.getFlags().getTimeEachFunction(); | |
| 226 if (TimeThisFunction) { | |
| 227 TimerID = Ctx.getTimerID(StackID, FuncName); | |
| 228 Ctx.pushTimer(TimerID, StackID); | |
| 229 } | |
| 230 ELFTextSection *Section = nullptr; | 224 ELFTextSection *Section = nullptr; |
| 231 ELFRelocationSection *RelSection = nullptr; | 225 ELFRelocationSection *RelSection = nullptr; |
| 232 const bool FunctionSections = Ctx.getFlags().getFunctionSections(); | 226 const bool FunctionSections = Ctx.getFlags().getFunctionSections(); |
| 233 if (TextSections.empty() || FunctionSections) { | 227 if (TextSections.empty() || FunctionSections) { |
| 234 IceString SectionName = ".text"; | 228 IceString SectionName = ".text"; |
| 235 if (FunctionSections) | 229 if (FunctionSections) |
| 236 SectionName += "." + FuncName; | 230 SectionName += "." + FuncName; |
| 237 constexpr Elf64_Xword ShFlags = SHF_ALLOC | SHF_EXECINSTR; | 231 constexpr Elf64_Xword ShFlags = SHF_ALLOC | SHF_EXECINSTR; |
| 238 const Elf64_Xword ShAlign = 1 << Asm->getBundleAlignLog2Bytes(); | 232 const Elf64_Xword ShAlign = 1 << Asm->getBundleAlignLog2Bytes(); |
| 239 Section = createSection<ELFTextSection>(SectionName, SHT_PROGBITS, ShFlags, | 233 Section = createSection<ELFTextSection>(SectionName, SHT_PROGBITS, ShFlags, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 if (!RelSection->isRela()) { | 265 if (!RelSection->isRela()) { |
| 272 // This is a non-rela section, so we need to update the instruction stream | 266 // This is a non-rela section, so we need to update the instruction stream |
| 273 // with the relocation addends. | 267 // with the relocation addends. |
| 274 for (const auto *Fixup : Fixups) { | 268 for (const auto *Fixup : Fixups) { |
| 275 Fixup->emitOffset(Asm); | 269 Fixup->emitOffset(Asm); |
| 276 } | 270 } |
| 277 } | 271 } |
| 278 RelSection->addRelocations(OffsetInSection, Asm->fixups(), SymTab); | 272 RelSection->addRelocations(OffsetInSection, Asm->fixups(), SymTab); |
| 279 } | 273 } |
| 280 Section->appendData(Str, Asm->getBufferView()); | 274 Section->appendData(Str, Asm->getBufferView()); |
| 281 if (TimeThisFunction) | |
| 282 Ctx.popTimer(TimerID, StackID); | |
| 283 } | 275 } |
| 284 | 276 |
| 285 namespace { | 277 namespace { |
| 286 | 278 |
| 287 ELFObjectWriter::SectionType | 279 ELFObjectWriter::SectionType |
| 288 classifyGlobalSection(const VariableDeclaration *Var) { | 280 classifyGlobalSection(const VariableDeclaration *Var) { |
| 289 if (Var->getIsConstant()) | 281 if (Var->getIsConstant()) |
| 290 return ELFObjectWriter::ROData; | 282 return ELFObjectWriter::ROData; |
| 291 if (Var->hasNonzeroInitializer()) | 283 if (Var->hasNonzeroInitializer()) |
| 292 return ELFObjectWriter::Data; | 284 return ELFObjectWriter::Data; |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 if (ELF64) { | 693 if (ELF64) { |
| 702 writeELFHeaderInternal<true>(ShOffset, ShStrTab->getNumber(), | 694 writeELFHeaderInternal<true>(ShOffset, ShStrTab->getNumber(), |
| 703 AllSections.size()); | 695 AllSections.size()); |
| 704 } else { | 696 } else { |
| 705 writeELFHeaderInternal<false>(ShOffset, ShStrTab->getNumber(), | 697 writeELFHeaderInternal<false>(ShOffset, ShStrTab->getNumber(), |
| 706 AllSections.size()); | 698 AllSections.size()); |
| 707 } | 699 } |
| 708 } | 700 } |
| 709 | 701 |
| 710 } // end of namespace Ice | 702 } // end of namespace Ice |
| OLD | NEW |