aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/go/go-linemap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/go/go-linemap.cc')
-rw-r--r--gcc-4.9/gcc/go/go-linemap.cc126
1 files changed, 126 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/go/go-linemap.cc b/gcc-4.9/gcc/go/go-linemap.cc
new file mode 100644
index 000000000..b41559ed4
--- /dev/null
+++ b/gcc-4.9/gcc/go/go-linemap.cc
@@ -0,0 +1,126 @@
+// 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;
+}