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