blob: 249ced8b59e7b38d86d1a664c4daaa625ee37e4e [file] [log] [blame]
//===- 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");
}
}