MC: Sprinkle in some more interesting statistics.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 23 Mar 2010 23:47:14 +0000 (23:47 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 23 Mar 2010 23:47:14 +0000 (23:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99350 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCAssembler.cpp
lib/MC/MCExpr.cpp

index b665cdff83e898a99e18b2d12b66be612eae4ace..a168abc02ec19508c1147d6a797beb1a07e205ec 100644 (file)
 #include <vector>
 using namespace llvm;
 
+namespace {
+namespace stats {
+STATISTIC(RelaxedInstructions, "Number of relaxed instructions");
+STATISTIC(RelaxationSteps, "Number of assembler layout and relaxation steps");
 STATISTIC(EmittedFragments, "Number of emitted assembler fragments");
+STATISTIC(EvaluateFixup, "Number of evaluated fixups");
+STATISTIC(ObjectBytes, "Number of emitted object file bytes");
+}
+}
 
 // FIXME FIXME FIXME: There are number of places in this file where we convert
 // what is a 64-bit assembler value used for computation into a value in the
@@ -234,6 +242,8 @@ const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
 bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
                                 const MCAsmFixup &Fixup, const MCFragment *DF,
                                 MCValue &Target, uint64_t &Value) const {
+  ++stats::EvaluateFixup;
+
   if (!Fixup.Value->EvaluateAsRelocatable(Target, &Layout))
     llvm_report_error("expected relocatable expression");
 
@@ -376,7 +386,7 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCFragment &F,
   uint64_t Start = OW->getStream().tell();
   (void) Start;
 
-  ++EmittedFragments;
+  ++stats::EmittedFragments;
 
   // FIXME: Embed in fragments instead?
   switch (F.getKind()) {
@@ -505,6 +515,7 @@ void MCAssembler::Finish() {
       llvm::errs() << "assembler backend - final-layout\n--\n";
       dump(); });
 
+  uint64_t StartOffset = OS.tell();
   llvm::OwningPtr<MCObjectWriter> Writer(getBackend().createObjectWriter(OS));
   if (!Writer)
     llvm_report_error("unable to create object writer!");
@@ -543,6 +554,8 @@ void MCAssembler::Finish() {
   // Write the object file.
   Writer->WriteObject(*this);
   OS.flush();
+
+  stats::ObjectBytes += OS.tell() - StartOffset;
 }
 
 bool MCAssembler::FixupNeedsRelaxation(const MCAsmFixup &Fixup,
@@ -575,6 +588,8 @@ bool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF,
 }
 
 bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
+  ++stats::RelaxationSteps;
+
   // Layout the concrete sections and fragments.
   uint64_t Address = 0;
   MCSectionData *Prev = 0;
@@ -629,6 +644,8 @@ bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
       if (!IF || !FragmentNeedsRelaxation(IF, Layout))
         continue;
 
+      ++stats::RelaxedInstructions;
+
       // FIXME-PERF: We could immediately lower out instructions if we can tell
       // they are fully resolved, to avoid retesting on later passes.
 
index d0025f3f3f60a234ead73d3b2c8c6eac24d23da8..a9256b632e2545664806f915f485691489f314e0 100644 (file)
@@ -7,7 +7,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#define DEBUG_TYPE "mcexpr"
 #include "llvm/MC/MCExpr.h"
+#include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/MC/MCAsmLayout.h"
 #include "llvm/MC/MCAssembler.h"
 #include "llvm/Target/TargetAsmBackend.h"
 using namespace llvm;
 
+namespace {
+namespace stats {
+STATISTIC(MCExprEvaluate, "Number of MCExpr evaluations");
+}
+}
+
 void MCExpr::print(raw_ostream &OS) const {
   switch (getKind()) {
   case MCExpr::Target:
@@ -231,6 +239,8 @@ static bool EvaluateSymbolicAdd(const MCValue &LHS,const MCSymbolRefExpr *RHS_A,
 
 bool MCExpr::EvaluateAsRelocatable(MCValue &Res,
                                    const MCAsmLayout *Layout) const {
+  ++stats::MCExprEvaluate;
+
   switch (getKind()) {
   case Target:
     return cast<MCTargetExpr>(this)->EvaluateAsRelocatableImpl(Res, Layout);