Index: src/IceELFObjectWriter.cpp |
diff --git a/src/IceELFObjectWriter.cpp b/src/IceELFObjectWriter.cpp |
index 762745799bb1240696204f527c5f5fa7025a6da6..5f3b0d3e2adb55e61da7c0dc0d087ccaa03a645a 100644 |
--- a/src/IceELFObjectWriter.cpp |
+++ b/src/IceELFObjectWriter.cpp |
@@ -219,6 +219,14 @@ Elf64_Off ELFObjectWriter::alignFileOffset(Elf64_Xword Align) { |
void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
bool IsInternal, Assembler *Asm) { |
assert(!SectionNumbersAssigned); |
+ TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
+ constexpr Ice::TimerStackIdT StackID = Ice::GlobalContext::TSK_Funcs; |
John
2016/03/07 22:40:39
No need to fully qualify these.
Karl
2016/03/08 21:52:47
Done.
|
+ Ice::TimerIdT TimerID = 0; |
+ bool TimeThisFunction = Ctx.getFlags().getTimeEachFunction(); |
+ if (TimeThisFunction) { |
+ TimerID = Ctx.getTimerID(StackID, FuncName); |
+ Ctx.pushTimer(TimerID, StackID); |
+ } |
ELFTextSection *Section = nullptr; |
ELFRelocationSection *RelSection = nullptr; |
const bool FunctionSections = Ctx.getFlags().getFunctionSections(); |
@@ -270,6 +278,8 @@ void ELFObjectWriter::writeFunctionCode(const IceString &FuncName, |
RelSection->addRelocations(OffsetInSection, Asm->fixups()); |
} |
Section->appendData(Str, Asm->getBufferView()); |
+ if (TimeThisFunction) |
+ Ctx.popTimer(TimerID, StackID); |
} |
namespace { |
@@ -303,6 +313,7 @@ void ELFObjectWriter::writeDataSection(const VariableDeclarationList &Vars, |
FixupKind RelocationKind, |
const IceString &SectionSuffix, |
bool IsPIC) { |
+ TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
assert(!SectionNumbersAssigned); |
VariableDeclarationList VarsBySection[ELFObjectWriter::NumSectionTypes]; |
for (auto &SectionList : VarsBySection) |
@@ -442,6 +453,7 @@ void ELFObjectWriter::writeDataOfType(SectionType ST, |
} |
void ELFObjectWriter::writeInitialELFHeader() { |
+ TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
assert(!SectionNumbersAssigned); |
constexpr Elf64_Off DummySHOffset = 0; |
constexpr SizeT DummySHStrIndex = 0; |
@@ -503,6 +515,7 @@ void ELFObjectWriter::writeELFHeaderInternal(Elf64_Off SectionHeaderOffset, |
} |
template <typename ConstType> void ELFObjectWriter::writeConstantPool(Type Ty) { |
+ TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
ConstantList Pool = Ctx.getConstantPool(Ty); |
if (Pool.empty()) { |
return; |
@@ -579,6 +592,7 @@ void ELFObjectWriter::writeAllRelocationSections() { |
void ELFObjectWriter::writeJumpTable(const JumpTableData &JT, |
FixupKind RelocationKind, bool IsPIC) { |
+ TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
ELFDataSection *Section; |
ELFRelocationSection *RelSection; |
const Elf64_Xword PointerSize = typeWidthInBytes(getPointerType()); |
@@ -648,6 +662,8 @@ void ELFObjectWriter::writeRelocationSections(RelSectionList &RelSections) { |
} |
void ELFObjectWriter::writeNonUserSections() { |
+ TimerMarker Timer(TimerStack::TT_writeELF, &Ctx); |
+ |
// Write out the shstrtab now that all sections are known. |
ShStrTab->doLayout(); |
ShStrTab->setSize(ShStrTab->getSectionDataSize()); |