blob: ad402ca1f0b30e5e79333d3b3e638e17d83852b5 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- mode: C++ -*-
//
// Copyright 2020-2022 Google LLC
//
// Licensed under the Apache License v2.0 with LLVM Exceptions (the
// "License"); you may not use this file except in compliance with the
// License. You may obtain a copy of the License at
//
// https://llvm.org/LICENSE.txt
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: Maria Teguiani
// Author: Giuliano Procida
// Author: Ignes Simeonova
#include "graph.h"
#include <ios>
#include <limits>
#include <ostream>
#include <string>
#include <string_view>
namespace stg {
const Id Id::kInvalid(std::numeric_limits<decltype(Id::ix_)>::max());
std::ostream& operator<<(std::ostream& os, Id id) {
return os << '<' << id.ix_ << '>';
}
std::ostream& operator<<(std::ostream& os, BaseClass::Inheritance inheritance) {
switch (inheritance) {
case BaseClass::Inheritance::NON_VIRTUAL:
return os << "non-virtual";
case BaseClass::Inheritance::VIRTUAL:
return os << "virtual";
}
}
namespace {
std::string_view ToString(StructUnion::Kind kind) {
switch (kind) {
case StructUnion::Kind::STRUCT:
return "struct";
case StructUnion::Kind::UNION:
return "union";
}
}
} // namespace
std::ostream& operator<<(std::ostream& os, StructUnion::Kind kind) {
return os << ToString(kind);
}
std::string& operator+=(std::string& os, StructUnion::Kind kind) {
return os += ToString(kind);
}
std::ostream& operator<<(std::ostream& os, Qualifier qualifier) {
switch (qualifier) {
case Qualifier::CONST:
return os << "const";
case Qualifier::VOLATILE:
return os << "volatile";
case Qualifier::RESTRICT:
return os << "restrict";
case Qualifier::ATOMIC:
return os << "atomic";
}
}
std::ostream& operator<<(std::ostream& os, ElfSymbol::SymbolType type) {
switch (type) {
case ElfSymbol::SymbolType::OBJECT:
return os << "variable";
case ElfSymbol::SymbolType::FUNCTION:
return os << "function";
case ElfSymbol::SymbolType::COMMON:
return os << "common";
case ElfSymbol::SymbolType::TLS:
return os << "TLS";
case ElfSymbol::SymbolType::GNU_IFUNC:
return os << "indirect (ifunc) function";
}
}
std::ostream& operator<<(std::ostream& os, ElfSymbol::Binding binding) {
switch (binding) {
case ElfSymbol::Binding::GLOBAL:
return os << "global";
case ElfSymbol::Binding::LOCAL:
return os << "local";
case ElfSymbol::Binding::WEAK:
return os << "weak";
case ElfSymbol::Binding::GNU_UNIQUE:
return os << "GNU unique";
}
}
std::ostream& operator<<(std::ostream& os, ElfSymbol::Visibility visibility) {
switch (visibility) {
case ElfSymbol::Visibility::DEFAULT:
return os << "default";
case ElfSymbol::Visibility::PROTECTED:
return os << "protected";
case ElfSymbol::Visibility::HIDDEN:
return os << "hidden";
case ElfSymbol::Visibility::INTERNAL:
return os << "internal";
}
}
std::string VersionInfoToString(const ElfSymbol::VersionInfo& version_info) {
return '@' + std::string(version_info.is_default ? "@" : "") +
version_info.name;
}
std::string VersionedSymbolName(const ElfSymbol& symbol) {
return symbol.symbol_name + (symbol.version_info
? VersionInfoToString(*symbol.version_info)
: std::string());
}
std::ostream& operator<<(std::ostream& os, ElfSymbol::CRC crc) {
return os << Hex(crc.number);
}
std::ostream& operator<<(std::ostream& os, Primitive::Encoding encoding) {
switch (encoding) {
case Primitive::Encoding::BOOLEAN:
return os << "boolean";
case Primitive::Encoding::SIGNED_INTEGER:
return os << "signed integer";
case Primitive::Encoding::UNSIGNED_INTEGER:
return os << "unsigned integer";
case Primitive::Encoding::SIGNED_CHARACTER:
return os << "signed character";
case Primitive::Encoding::UNSIGNED_CHARACTER:
return os << "unsigned character";
case Primitive::Encoding::REAL_NUMBER:
return os << "real number";
case Primitive::Encoding::COMPLEX_NUMBER:
return os << "complex number";
case Primitive::Encoding::UTF:
return os << "UTF";
}
}
} // namespace stg