1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_diagnostic_buffer.h" 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/SourceLocation.h" 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/SourceManager.h" 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/ADT/SmallString.h" 23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 246e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 256e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines 26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 289207a2e495c8363606861e4f034504ec5c153dabLogan ChienDiagnosticBuffer::DiagnosticBuffer() 29c86623eb960965b240bc5e929e760f6bbc1be544Logan Chien : mSOS(new llvm::raw_string_ostream(mDiags)) { 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 329207a2e495c8363606861e4f034504ec5c153dabLogan ChienDiagnosticBuffer::~DiagnosticBuffer() { 339207a2e495c8363606861e4f034504ec5c153dabLogan Chien} 349207a2e495c8363606861e4f034504ec5c153dabLogan Chien 359207a2e495c8363606861e4f034504ec5c153dabLogan Chienvoid DiagnosticBuffer::HandleDiagnostic( 36e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::DiagnosticsEngine::Level DiagLevel, 37e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::Diagnostic const &Info) { 389207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::SourceLocation const &SrcLoc = Info.getLocation(); 399207a2e495c8363606861e4f034504ec5c153dabLogan Chien 405309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet std::string Message; 415309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet llvm::raw_string_ostream stream(Message); 429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 43be27482cdeaf08576bc39b72a15d35d13014a636Logan if (SrcLoc.isValid()) { 445309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet SrcLoc.print(stream, Info.getSourceManager()); 455309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream << ": "; 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (DiagLevel) { 499207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Note: { 505309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream << "note: "; 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 539207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Warning: { 545309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream << "warning: "; 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 579207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Error: { 585309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream << "error: "; 599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 619207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Fatal: { 625309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream << "fatal: "; 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 666e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(0 && "Diagnostic not handled during diagnostic buffering!"); 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 695309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet // 100 is enough for storing general diagnosis Message 705309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet llvm::SmallString<100> Buf; 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Info.FormatDiagnostic(Buf); 725309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream << Buf.str() << '\n'; 735309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet stream.flush(); 74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 755309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet if (mIncludedMessages.find(Message) == mIncludedMessages.end()) { 765309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet mIncludedMessages.insert(Message); 775309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet (*mSOS) << Message; 785309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet } 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 80e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 81e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 82