| //===- llvm/tools/gollvm/unittests/BackendCore/LinemapTests.cpp -----===// |
| // |
| // Copyright 2018 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 "TestUtils.h" |
| #include "gtest/gtest.h" |
| #include "go-llvm-linemap.h" |
| #include "go-location.h" |
| |
| #include "llvm/Support/Path.h" |
| |
| namespace { |
| |
| TEST(LinemapTests, CreateLinemap) { |
| std::unique_ptr<Linemap> lm(go_get_linemap()); |
| } |
| |
| TEST(LinemapTests, BasicLinemap) { |
| std::unique_ptr<Llvm_linemap> lm(new Llvm_linemap()); |
| |
| Location ul = Linemap::unknown_location(); |
| Location pdl = Linemap::predeclared_location(); |
| EXPECT_TRUE(ul.handle() != pdl.handle()); |
| EXPECT_EQ(lm->to_string(ul), ""); |
| EXPECT_EQ(lm->to_string(pdl), "<built-in>"); |
| EXPECT_EQ(lm->get_initial_file(), ""); |
| |
| lm->start_file("foo.go", 10); |
| EXPECT_EQ(lm->to_string(ul), ""); |
| EXPECT_EQ(lm->to_string(pdl), "<built-in>"); |
| EXPECT_EQ(lm->get_initial_file(), "foo.go"); |
| Location f10 = lm->get_location(1); |
| lm->start_line(12, 256); |
| Location f12 = lm->get_location(1); |
| Location f12c5 = lm->get_location(5); |
| Location f12x = lm->get_location(1); |
| EXPECT_TRUE(f10.handle() != ul.handle()); |
| EXPECT_TRUE(f10.handle() != pdl.handle()); |
| EXPECT_TRUE(f12.handle() != f10.handle()); |
| EXPECT_TRUE(f12.handle() != f12c5.handle()); |
| EXPECT_NE(f12x.handle(), f12.handle()); // no line/col hashing currently |
| EXPECT_EQ(lm->to_string(f12x), lm->to_string(f12)); |
| EXPECT_EQ(lm->location_line(f10), 10); |
| EXPECT_EQ(lm->location_file(f10), std::string("foo.go")); |
| EXPECT_EQ(lm->location_line(f12), 12); |
| EXPECT_EQ(lm->location_column(f12), 1u); |
| EXPECT_EQ(lm->location_column(f12c5), 5u); |
| EXPECT_EQ(lm->location_line(f12x), 12); |
| EXPECT_EQ(lm->location_line(f12c5), 12); |
| |
| lm->start_file("blix.go", 89); |
| EXPECT_EQ(lm->get_initial_file(), "foo.go"); |
| lm->start_file("/tmp/bar.go", 1); |
| Location b1 = lm->get_location(1); |
| lm->start_line(22, 0); |
| Location b22 = lm->get_location(1); |
| Location b22c9 = lm->get_location(9); |
| EXPECT_TRUE(b22.handle() != b22c9.handle()); |
| std::string b22s = lm->to_string(b22); |
| std::string b22c9s = lm->to_string(b22c9); |
| EXPECT_EQ(b22s, b22c9s); |
| EXPECT_EQ(b22s, "bar.go:22"); |
| lm->start_file("foo.go", 10); |
| Location x10 = lm->get_location(1); |
| EXPECT_EQ(lm->to_string(b22), b22s); |
| EXPECT_TRUE(x10.handle() != b1.handle()); |
| lm->start_line(12, 256); |
| Location x12 = lm->get_location(1); |
| EXPECT_NE(x12.handle(), f12.handle()); |
| EXPECT_EQ(lm->to_string(x12), lm->to_string(f12)); |
| |
| std::string stats = lm->statistics(); |
| EXPECT_EQ(stats, "accesses=9 files=5 segments=4 " |
| "locmem=22 bytes/location=2.4"); |
| } |
| |
| } |