logging.cc revision 12334:e0ab29a34764
16019Shines@cs.fsu.edu/* 26019Shines@cs.fsu.edu * Copyright (c) 2014, 2017 ARM Limited 313120SEdmund.Grimley-Evans@arm.com * All rights reserved 47178Sgblack@eecs.umich.edu * 57178Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 67178Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 77178Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 87178Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 97178Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 107178Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 117178Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 127178Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 137178Sgblack@eecs.umich.edu * 147178Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 156019Shines@cs.fsu.edu * All rights reserved. 166019Shines@cs.fsu.edu * 176019Shines@cs.fsu.edu * Redistribution and use in source and binary forms, with or without 186019Shines@cs.fsu.edu * modification, are permitted provided that the following conditions are 196019Shines@cs.fsu.edu * met: redistributions of source code must retain the above copyright 206019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer; 216019Shines@cs.fsu.edu * redistributions in binary form must reproduce the above copyright 226019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer in the 236019Shines@cs.fsu.edu * documentation and/or other materials provided with the distribution; 246019Shines@cs.fsu.edu * neither the name of the copyright holders nor the names of its 256019Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from 266019Shines@cs.fsu.edu * this software without specific prior written permission. 276019Shines@cs.fsu.edu * 286019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 296019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 306019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 316019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 326019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 336019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 346019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 356019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 366019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 376019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 386019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 396019Shines@cs.fsu.edu * 406019Shines@cs.fsu.edu * Authors: Nathan Binkert 416019Shines@cs.fsu.edu * Andreas Sandberg 426019Shines@cs.fsu.edu */ 436019Shines@cs.fsu.edu 446019Shines@cs.fsu.edu#include "base/logging.hh" 456019Shines@cs.fsu.edu 466019Shines@cs.fsu.edu#include <array> 476019Shines@cs.fsu.edu 487639Sgblack@eecs.umich.edu#include "base/hostinfo.hh" 497639Sgblack@eecs.umich.edu#include "base/output.hh" 507639Sgblack@eecs.umich.edu#include "base/trace.hh" 517639Sgblack@eecs.umich.edu#include "base/types.hh" 527639Sgblack@eecs.umich.edu#include "sim/core.hh" 537639Sgblack@eecs.umich.edu 547639Sgblack@eecs.umich.eduvoid 557639Sgblack@eecs.umich.eduLogger::setLevel(LogLevel ll) 567639Sgblack@eecs.umich.edu{ 577639Sgblack@eecs.umich.edu for (int i = 0; i < NUM_LOG_LEVELS; ++i) 587639Sgblack@eecs.umich.edu get(LogLevel(i)).enabled = (i <= ll); 597639Sgblack@eecs.umich.edu} 607639Sgblack@eecs.umich.edu 617639Sgblack@eecs.umich.edustatic void 627639Sgblack@eecs.umich.edunewline_if_needed(std::ostream &stream, const char *format) 637639Sgblack@eecs.umich.edu{ 647639Sgblack@eecs.umich.edu const size_t format_len(strlen(format)); 657639Sgblack@eecs.umich.edu 667639Sgblack@eecs.umich.edu switch (format_len ? format[format_len - 1] : '\0') { 677639Sgblack@eecs.umich.edu case '\n': 687639Sgblack@eecs.umich.edu case '\r': 697639Sgblack@eecs.umich.edu break; 707639Sgblack@eecs.umich.edu default: 717639Sgblack@eecs.umich.edu stream << std::endl; 727639Sgblack@eecs.umich.edu } 737639Sgblack@eecs.umich.edu} 747639Sgblack@eecs.umich.edu 757639Sgblack@eecs.umich.eduLogger::Logger(std::ostream &_stream, const char *_prefix) 767639Sgblack@eecs.umich.edu : enabled(true), verbose(false), stream(_stream), prefix(_prefix) 777639Sgblack@eecs.umich.edu{ 787639Sgblack@eecs.umich.edu} 797639Sgblack@eecs.umich.edu 807639Sgblack@eecs.umich.eduvoid 817639Sgblack@eecs.umich.eduLogger::printEpilogue(const char *func, const char *file, int line, 827639Sgblack@eecs.umich.edu const char *format) 837639Sgblack@eecs.umich.edu{ 847639Sgblack@eecs.umich.edu newline_if_needed(stream, format); 857639Sgblack@eecs.umich.edu 867639Sgblack@eecs.umich.edu if (verbose) { 877639Sgblack@eecs.umich.edu ccprintf(stream, " @ tick %d\n[%s:%s, line %d]\n", 887639Sgblack@eecs.umich.edu curTick(), func, file, line); 897639Sgblack@eecs.umich.edu } 907639Sgblack@eecs.umich.edu} 917639Sgblack@eecs.umich.edu 927639Sgblack@eecs.umich.educlass ExitLogger : public Logger 937639Sgblack@eecs.umich.edu{ 947356Sgblack@eecs.umich.edu public: 957356Sgblack@eecs.umich.edu using Logger::Logger; 967356Sgblack@eecs.umich.edu 977435Sgblack@eecs.umich.edu void printEpilogue(const char *func, const char *file, int line, 987435Sgblack@eecs.umich.edu const char *format) override; 997435Sgblack@eecs.umich.edu}; 1007435Sgblack@eecs.umich.edu 1017435Sgblack@eecs.umich.eduvoid 1027435Sgblack@eecs.umich.eduExitLogger::printEpilogue(const char *func, const char *file, int line, 1037435Sgblack@eecs.umich.edu const char *format) 1047435Sgblack@eecs.umich.edu{ 1057435Sgblack@eecs.umich.edu Logger::printEpilogue(func, file, line, format); 1067435Sgblack@eecs.umich.edu 1077435Sgblack@eecs.umich.edu ccprintf(stream, "Memory Usage: %ld KBytes\n", memUsage()); 1087639Sgblack@eecs.umich.edu} 1097639Sgblack@eecs.umich.edu 1107639Sgblack@eecs.umich.eduLogger & 1117435Sgblack@eecs.umich.eduLogger::get(LogLevel ll) 1127639Sgblack@eecs.umich.edu{ 1137639Sgblack@eecs.umich.edu static std::array<Logger *, NUM_LOG_LEVELS> loggers{{ 1147639Sgblack@eecs.umich.edu new ExitLogger(std::cerr, "panic"), 1157639Sgblack@eecs.umich.edu new ExitLogger(std::cerr, "fatal"), 1167639Sgblack@eecs.umich.edu new Logger(std::cerr, "warn"), 1177639Sgblack@eecs.umich.edu new Logger(std::cerr, "info"), 1187639Sgblack@eecs.umich.edu new Logger(std::cerr, "hack"), 1197639Sgblack@eecs.umich.edu }}; 1207639Sgblack@eecs.umich.edu 1217639Sgblack@eecs.umich.edu return *loggers[ll]; 1227639Sgblack@eecs.umich.edu} 1237639Sgblack@eecs.umich.edu