blob: fb993b9e9b59327e0982e72c3735aa375d8c53bf [file] [log] [blame]
// Copyright (C) 2020-2024 Free Software Foundation, Inc.
// This file is part of GCC.
// GCC is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3, or (at your option) any later
// version.
// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
// You should have received a copy of the GNU General Public License
// along with GCC; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// rust-linemap.cc -- GCC implementation of Linemap.
#include "rust-linemap.h"
Linemap *Linemap::instance_ = NULL;
// Start getting locations from a new file.
void
Linemap::start_file (const char *file_name, unsigned line_begin)
{
if (this->in_file_)
linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
linemap_add (line_table, LC_ENTER, 0, file_name, line_begin);
this->in_file_ = true;
}
// Stringify a location
std::string
Linemap::location_to_string (location_t location)
{
const line_map_ordinary *lmo;
location_t resolved_location;
// Screen out unknown and predeclared locations; produce output
// only for simple file:line locations.
resolved_location = linemap_resolve_location (line_table, location,
LRK_SPELLING_LOCATION, &lmo);
if (lmo == NULL || resolved_location < RESERVED_LOCATION_COUNT)
return "";
const char *path = LINEMAP_FILE (lmo);
if (!path)
return "";
// Strip the source file down to the base file, to reduce clutter.
std::stringstream ss;
ss << lbasename (path) << ":" << SOURCE_LINE (lmo, location) << ":"
<< SOURCE_COLUMN (lmo, location);
return ss.str ();
}
// Stop getting locations.
void
Linemap::stop ()
{
linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
this->in_file_ = false;
}
// Return the Linemap to use for the gcc backend.
Linemap *
rust_get_linemap ()
{
return new Linemap;
}