1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- raw_ostream.cpp ----------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/raw_ostream.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 11affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// raw_ostream 15affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::raw_fd_ostream(const char *pFilename, 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang std::string &pErrorInfo, 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unsigned int pFlags, 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const MCLDInfo* pLDInfo) 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : llvm::raw_fd_ostream(pFilename, pErrorInfo, pFlags), m_pLDInfo(pLDInfo) { 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 22affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::raw_fd_ostream(int pFD, 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool pShouldClose, 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool pUnbuffered, 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const MCLDInfo* pLDInfo) 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : llvm::raw_fd_ostream(pFD, pShouldClose, pUnbuffered), m_pLDInfo(pLDInfo) { 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 29affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::~raw_fd_ostream() 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 33affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid mcld::raw_fd_ostream::setLDInfo(const MCLDInfo& pLDInfo) 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_pLDInfo = &pLDInfo; 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 38affc150dc44fab1911775a49636d0ce85333b634Zonr Changllvm::raw_ostream & 39affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream::changeColor(enum llvm::raw_ostream::Colors pColor, 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool pBold, 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool pBackground) 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!is_displayed()) 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return *this; 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_fd_ostream::changeColor(pColor, pBold, pBackground); 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 48affc150dc44fab1911775a49636d0ce85333b634Zonr Changllvm::raw_ostream& mcld::raw_fd_ostream::resetColor() 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!is_displayed()) 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return *this; 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_fd_ostream::resetColor(); 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// FIXME: migrate to newer LLVM 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** 57affc150dc44fab1911775a49636d0ce85333b634Zonr Changllvm::raw_ostream& mcld::raw_fd_ostream::reverseColor() 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!is_displayed()) 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return *this; 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_ostream::reverseColor(); 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang**/ 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 65affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool mcld::raw_fd_ostream::is_displayed() const 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (NULL == m_pLDInfo) 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return llvm::raw_fd_ostream::is_displayed(); 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return m_pLDInfo->options().color(); 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// outs(), errs(), nulls() 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 76affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream& mcld::outs() { 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // Set buffer settings to model stdout behavior. 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // Delete the file descriptor when the program exists, forcing error 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // detection. If you don't want this behavior, don't use outs(). 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang static mcld::raw_fd_ostream S(STDOUT_FILENO, true, NULL); 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return S; 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 84affc150dc44fab1911775a49636d0ce85333b634Zonr Changmcld::raw_fd_ostream& mcld::errs() { 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // Set standard error to be unbuffered by default. 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang static mcld::raw_fd_ostream S(STDERR_FILENO, false, true, NULL); 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return S; 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 90affc150dc44fab1911775a49636d0ce85333b634Zonr Changvoid mcld::InitializeOStreams(const MCLDInfo& pLDInfo) 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang outs().setLDInfo(pLDInfo); 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang errs().setLDInfo(pLDInfo); 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 96