SourceLocation.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines serialization methods for the SourceLocation class.
  11. // This file defines accessor methods for the FullSourceLoc class.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/Basic/SourceLocation.h"
  15. #include "clang/Basic/SourceManager.h"
  16. #include "llvm/Bitcode/Serialize.h"
  17. #include "llvm/Bitcode/Deserialize.h"
  18. #include "llvm/Support/MemoryBuffer.h"
  19. #include <cstdio>
  20. using namespace clang;
  21. void SourceLocation::Emit(llvm::Serializer& S) const {
  22. S.EmitInt(getRawEncoding());
  23. }
  24. SourceLocation SourceLocation::ReadVal(llvm::Deserializer& D) {
  25. return SourceLocation::getFromRawEncoding(D.ReadInt());
  26. }
  27. void SourceLocation::dump(const SourceManager &SM) const {
  28. if (!isValid()) {
  29. fprintf(stderr, "<invalid loc>");
  30. return;
  31. }
  32. if (isFileID()) {
  33. PresumedLoc PLoc = SM.getPresumedLoc(*this);
  34. // The instantiation and spelling pos is identical for file locs.
  35. fprintf(stderr, "%s:%d:%d",
  36. PLoc.getFilename(), PLoc.getLine(), PLoc.getColumn());
  37. return;
  38. }
  39. SM.getInstantiationLoc(*this).dump(SM);
  40. fprintf(stderr, " <Spelling=");
  41. SM.getSpellingLoc(*this).dump(SM);
  42. fprintf(stderr, ">");
  43. }
  44. void SourceRange::Emit(llvm::Serializer& S) const {
  45. B.Emit(S);
  46. E.Emit(S);
  47. }
  48. SourceRange SourceRange::ReadVal(llvm::Deserializer& D) {
  49. SourceLocation A = SourceLocation::ReadVal(D);
  50. SourceLocation B = SourceLocation::ReadVal(D);
  51. return SourceRange(A,B);
  52. }
  53. FileID FullSourceLoc::getFileID() const {
  54. assert(isValid());
  55. return SrcMgr->getFileID(*this);
  56. }
  57. FullSourceLoc FullSourceLoc::getInstantiationLoc() const {
  58. assert(isValid());
  59. return FullSourceLoc(SrcMgr->getInstantiationLoc(*this), *SrcMgr);
  60. }
  61. FullSourceLoc FullSourceLoc::getSpellingLoc() const {
  62. assert(isValid());
  63. return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
  64. }
  65. unsigned FullSourceLoc::getInstantiationLineNumber() const {
  66. assert(isValid());
  67. return SrcMgr->getInstantiationLineNumber(*this);
  68. }
  69. unsigned FullSourceLoc::getInstantiationColumnNumber() const {
  70. assert(isValid());
  71. return SrcMgr->getInstantiationColumnNumber(*this);
  72. }
  73. unsigned FullSourceLoc::getSpellingLineNumber() const {
  74. assert(isValid());
  75. return SrcMgr->getSpellingLineNumber(*this);
  76. }
  77. unsigned FullSourceLoc::getSpellingColumnNumber() const {
  78. assert(isValid());
  79. return SrcMgr->getSpellingColumnNumber(*this);
  80. }
  81. bool FullSourceLoc::isInSystemHeader() const {
  82. assert(isValid());
  83. return SrcMgr->isInSystemHeader(*this);
  84. }
  85. const char *FullSourceLoc::getCharacterData() const {
  86. assert(isValid());
  87. return SrcMgr->getCharacterData(*this);
  88. }
  89. const llvm::MemoryBuffer* FullSourceLoc::getBuffer() const {
  90. assert(isValid());
  91. return SrcMgr->getBuffer(SrcMgr->getFileID(*this));
  92. }
  93. std::pair<const char*, const char*> FullSourceLoc::getBufferData() const {
  94. const llvm::MemoryBuffer *Buf = getBuffer();
  95. return std::make_pair(Buf->getBufferStart(), Buf->getBufferEnd());
  96. }