123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- // go-linemap.cc -- GCC implementation of Linemap.
- // Copyright 2011 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- #include "go-linemap.h"
- // This class implements the Linemap interface defined by the
- // frontend.
- class Gcc_linemap : public Linemap
- {
- public:
- Gcc_linemap()
- : Linemap(),
- in_file_(false)
- { }
- void
- start_file(const char* file_name, unsigned int line_begin);
- void
- start_line(unsigned int line_number, unsigned int line_size);
- Location
- get_location(unsigned int column);
- void
- stop();
- protected:
- Location
- get_predeclared_location();
- Location
- get_unknown_location();
- bool
- is_predeclared(Location);
- bool
- is_unknown(Location);
- private:
- // Whether we are currently reading a file.
- bool in_file_;
- };
- Linemap* Linemap::instance_ = NULL;
- // Start getting locations from a new file.
- void
- Gcc_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;
- }
- // Stop getting locations.
- void
- Gcc_linemap::stop()
- {
- linemap_add(line_table, LC_LEAVE, 0, NULL, 0);
- this->in_file_ = false;
- }
- // Start a new line.
- void
- Gcc_linemap::start_line(unsigned lineno, unsigned linesize)
- {
- linemap_line_start(line_table, lineno, linesize);
- }
- // Get a location.
- Location
- Gcc_linemap::get_location(unsigned column)
- {
- return Location(linemap_position_for_column(line_table, column));
- }
- // Get the unknown location.
- Location
- Gcc_linemap::get_unknown_location()
- {
- return Location(UNKNOWN_LOCATION);
- }
- // Get the predeclared location.
- Location
- Gcc_linemap::get_predeclared_location()
- {
- return Location(BUILTINS_LOCATION);
- }
- // Return whether a location is the predeclared location.
- bool
- Gcc_linemap::is_predeclared(Location loc)
- {
- return loc.gcc_location() == BUILTINS_LOCATION;
- }
- // Return whether a location is the unknown location.
- bool
- Gcc_linemap::is_unknown(Location loc)
- {
- return loc.gcc_location() == UNKNOWN_LOCATION;
- }
- // Return the Linemap to use for the gcc backend.
- Linemap*
- go_get_linemap()
- {
- return new Gcc_linemap;
- }
|