trace.hh revision 4046:ef34b290091e
18706Sandreas.hansson@arm.com/*
28706Sandreas.hansson@arm.com * Copyright (c) 2001-2006 The Regents of The University of Michigan
38706Sandreas.hansson@arm.com * All rights reserved.
48706Sandreas.hansson@arm.com *
58706Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68706Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78706Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88706Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98706Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108706Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118706Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128706Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
138706Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
148706Sandreas.hansson@arm.com * this software without specific prior written permission.
158706Sandreas.hansson@arm.com *
168706Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178706Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188706Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198706Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208706Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218706Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228706Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238706Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248706Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258706Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268706Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278706Sandreas.hansson@arm.com *
288706Sandreas.hansson@arm.com * Authors: Nathan Binkert
298706Sandreas.hansson@arm.com *          Steve Reinhardt
308706Sandreas.hansson@arm.com */
318706Sandreas.hansson@arm.com
328706Sandreas.hansson@arm.com#ifndef __BASE_TRACE_HH__
338706Sandreas.hansson@arm.com#define __BASE_TRACE_HH__
348706Sandreas.hansson@arm.com
358706Sandreas.hansson@arm.com#include <string>
368706Sandreas.hansson@arm.com#include <vector>
378706Sandreas.hansson@arm.com
388706Sandreas.hansson@arm.com#include "base/cprintf.hh"
398706Sandreas.hansson@arm.com#include "base/match.hh"
408706Sandreas.hansson@arm.com#include "base/traceflags.hh"
418706Sandreas.hansson@arm.com#include "sim/host.hh"
428706Sandreas.hansson@arm.com#include "sim/root.hh"
438706Sandreas.hansson@arm.com
448706Sandreas.hansson@arm.comnamespace Trace {
458706Sandreas.hansson@arm.com
468706Sandreas.hansson@arm.comstd::ostream &output();
478706Sandreas.hansson@arm.comvoid setOutput(const std::string &filename);
488706Sandreas.hansson@arm.com
498706Sandreas.hansson@arm.comextern bool enabled;
508706Sandreas.hansson@arm.comtypedef std::vector<bool> FlagVec;
518706Sandreas.hansson@arm.comextern FlagVec flags;
528706Sandreas.hansson@arm.cominline bool IsOn(int t) { return flags[t]; }
538706Sandreas.hansson@arm.combool changeFlag(const char *str, bool value);
548706Sandreas.hansson@arm.comvoid dumpStatus();
558706Sandreas.hansson@arm.com
568706Sandreas.hansson@arm.comextern ObjectMatch ignore;
578706Sandreas.hansson@arm.comextern const std::string DefaultName;
588706Sandreas.hansson@arm.com
598706Sandreas.hansson@arm.comvoid dprintf(Tick when, const std::string &name, const char *format,
608706Sandreas.hansson@arm.com             CPRINTF_DECLARATION);
618706Sandreas.hansson@arm.comvoid dump(Tick when, const std::string &name, const void *data, int len);
628706Sandreas.hansson@arm.com
638706Sandreas.hansson@arm.com/* namespace Trace */ }
648706Sandreas.hansson@arm.com
658706Sandreas.hansson@arm.com// This silly little class allows us to wrap a string in a functor
668706Sandreas.hansson@arm.com// object so that we can give a name() that DPRINTF will like
678706Sandreas.hansson@arm.comstruct StringWrap
688706Sandreas.hansson@arm.com{
698706Sandreas.hansson@arm.com    std::string str;
708706Sandreas.hansson@arm.com    StringWrap(const std::string &s) : str(s) {}
718706Sandreas.hansson@arm.com    const std::string &operator()() const { return str; }
728706Sandreas.hansson@arm.com};
738706Sandreas.hansson@arm.com
748706Sandreas.hansson@arm.cominline const std::string &name() { return Trace::DefaultName; }
758706Sandreas.hansson@arm.com
768706Sandreas.hansson@arm.com//
778706Sandreas.hansson@arm.com// DPRINTF is a debugging trace facility that allows one to
788706Sandreas.hansson@arm.com// selectively enable tracing statements.  To use DPRINTF, there must
798706Sandreas.hansson@arm.com// be a function or functor called name() that returns a const
808706Sandreas.hansson@arm.com// std::string & in the current scope.
818706Sandreas.hansson@arm.com//
828706Sandreas.hansson@arm.com// If you desire that the automatic printing not occur, use DPRINTFR
838706Sandreas.hansson@arm.com// (R for raw)
848706Sandreas.hansson@arm.com//
858706Sandreas.hansson@arm.com
868706Sandreas.hansson@arm.com#if TRACING_ON
878706Sandreas.hansson@arm.com
888706Sandreas.hansson@arm.com#define DTRACE(x) (Trace::IsOn(Trace::x) && Trace::enabled)
898706Sandreas.hansson@arm.com
908706Sandreas.hansson@arm.com#define DDUMP(x, data, count) do {                              \
918706Sandreas.hansson@arm.com    if (DTRACE(x))                                              \
928706Sandreas.hansson@arm.com        Trace::dump(curTick, name(), data, count);              \
938706Sandreas.hansson@arm.com} while (0)
948706Sandreas.hansson@arm.com
958706Sandreas.hansson@arm.com#define DPRINTF(x, ...) do {                                    \
968706Sandreas.hansson@arm.com    if (DTRACE(x))                                              \
978706Sandreas.hansson@arm.com        Trace::dprintf(curTick, name(), __VA_ARGS__);           \
988706Sandreas.hansson@arm.com} while (0)
998706Sandreas.hansson@arm.com
1008706Sandreas.hansson@arm.com#define DPRINTFR(x, ...) do {                                   \
1018706Sandreas.hansson@arm.com    if (DTRACE(x))                                              \
1028706Sandreas.hansson@arm.com        Trace::dprintf((Tick)-1, std::string(), __VA_ARGS__);   \
1038706Sandreas.hansson@arm.com} while (0)
1048706Sandreas.hansson@arm.com
1058706Sandreas.hansson@arm.com#define DDUMPN(data, count) do {                                \
1068706Sandreas.hansson@arm.com    Trace::dump(curTick, name(), data, count);                  \
1078706Sandreas.hansson@arm.com} while (0)
1088706Sandreas.hansson@arm.com
1098706Sandreas.hansson@arm.com#define DPRINTFN(...) do {                                      \
1108706Sandreas.hansson@arm.com    Trace::dprintf(curTick, name(), __VA_ARGS__);               \
1118706Sandreas.hansson@arm.com} while (0)
1128706Sandreas.hansson@arm.com
1138706Sandreas.hansson@arm.com#define DPRINTFNR(...) do {                                     \
1148706Sandreas.hansson@arm.com    Trace::dprintf((Tick)-1, string(), __VA_ARGS__);            \
1158706Sandreas.hansson@arm.com} while (0)
1168706Sandreas.hansson@arm.com
1178706Sandreas.hansson@arm.com#else // !TRACING_ON
1188706Sandreas.hansson@arm.com
1198706Sandreas.hansson@arm.com#define DTRACE(x) (false)
1208706Sandreas.hansson@arm.com#define DDUMP(x, data, count) do {} while (0)
1218706Sandreas.hansson@arm.com#define DPRINTF(x, ...) do {} while (0)
1228706Sandreas.hansson@arm.com#define DPRINTFR(...) do {} while (0)
1238706Sandreas.hansson@arm.com#define DDUMPN(data, count) do {} while (0)
1248706Sandreas.hansson@arm.com#define DPRINTFN(...) do {} while (0)
1258706Sandreas.hansson@arm.com#define DPRINTFNR(...) do {} while (0)
1268706Sandreas.hansson@arm.com
1278706Sandreas.hansson@arm.com#endif	// TRACING_ON
1288706Sandreas.hansson@arm.com
1298706Sandreas.hansson@arm.com#endif // __BASE_TRACE_HH__
1308706Sandreas.hansson@arm.com