mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-01 06:46:08 +00:00

This avoids an unnecessary copy required by 'return OS.str()', allowing instead for NRVO or implicit move. The .str() call (which flushes the stream) is no longer required since 65b13610a5226b84889b923bae884ba395ad084d, which made raw_string_ostream unbuffered by default. Differential Revision: https://reviews.llvm.org/D115374
127 lines
2.8 KiB
C++
127 lines
2.8 KiB
C++
//===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines several version-related utility functions for Clang.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/Basic/Version.h"
|
|
#include "clang/Basic/LLVM.h"
|
|
#include "clang/Config/config.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
|
|
#include "VCSVersion.inc"
|
|
|
|
namespace clang {
|
|
|
|
std::string getClangRepositoryPath() {
|
|
#if defined(CLANG_REPOSITORY_STRING)
|
|
return CLANG_REPOSITORY_STRING;
|
|
#else
|
|
#ifdef CLANG_REPOSITORY
|
|
return CLANG_REPOSITORY;
|
|
#else
|
|
return "";
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
std::string getLLVMRepositoryPath() {
|
|
#ifdef LLVM_REPOSITORY
|
|
return LLVM_REPOSITORY;
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
std::string getClangRevision() {
|
|
#ifdef CLANG_REVISION
|
|
return CLANG_REVISION;
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
std::string getLLVMRevision() {
|
|
#ifdef LLVM_REVISION
|
|
return LLVM_REVISION;
|
|
#else
|
|
return "";
|
|
#endif
|
|
}
|
|
|
|
std::string getClangFullRepositoryVersion() {
|
|
std::string buf;
|
|
llvm::raw_string_ostream OS(buf);
|
|
std::string Path = getClangRepositoryPath();
|
|
std::string Revision = getClangRevision();
|
|
if (!Path.empty() || !Revision.empty()) {
|
|
OS << '(';
|
|
if (!Path.empty())
|
|
OS << Path;
|
|
if (!Revision.empty()) {
|
|
if (!Path.empty())
|
|
OS << ' ';
|
|
OS << Revision;
|
|
}
|
|
OS << ')';
|
|
}
|
|
// Support LLVM in a separate repository.
|
|
std::string LLVMRev = getLLVMRevision();
|
|
if (!LLVMRev.empty() && LLVMRev != Revision) {
|
|
OS << " (";
|
|
std::string LLVMRepo = getLLVMRepositoryPath();
|
|
if (!LLVMRepo.empty())
|
|
OS << LLVMRepo << ' ';
|
|
OS << LLVMRev << ')';
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
std::string getClangFullVersion() {
|
|
return getClangToolFullVersion("clang");
|
|
}
|
|
|
|
std::string getClangToolFullVersion(StringRef ToolName) {
|
|
std::string buf;
|
|
llvm::raw_string_ostream OS(buf);
|
|
#ifdef CLANG_VENDOR
|
|
OS << CLANG_VENDOR;
|
|
#endif
|
|
OS << ToolName << " version " CLANG_VERSION_STRING;
|
|
|
|
std::string repo = getClangFullRepositoryVersion();
|
|
if (!repo.empty()) {
|
|
OS << " " << repo;
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
std::string getClangFullCPPVersion() {
|
|
// The version string we report in __VERSION__ is just a compacted version of
|
|
// the one we report on the command line.
|
|
std::string buf;
|
|
llvm::raw_string_ostream OS(buf);
|
|
#ifdef CLANG_VENDOR
|
|
OS << CLANG_VENDOR;
|
|
#endif
|
|
OS << "Clang " CLANG_VERSION_STRING;
|
|
|
|
std::string repo = getClangFullRepositoryVersion();
|
|
if (!repo.empty()) {
|
|
OS << " " << repo;
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
} // end namespace clang
|