xref: /llvm-project/llvm/unittests/DebugInfo/PDB/NativeSessionTest.cpp (revision eb4c8608115c1c9af0fc8cb5b1e9f2bc960014ef)
123609331SAmy Huang //===- llvm/unittest/DebugInfo/PDB/NativeSessionTest.cpp ------------------===//
223609331SAmy Huang //
323609331SAmy Huang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
423609331SAmy Huang // See https://llvm.org/LICENSE.txt for license information.
523609331SAmy Huang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
623609331SAmy Huang //
723609331SAmy Huang //===----------------------------------------------------------------------===//
823609331SAmy Huang 
923609331SAmy Huang #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
10*eb4c8608Sserge-sans-paille #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
1123609331SAmy Huang #include "llvm/DebugInfo/PDB/IPDBSession.h"
1223609331SAmy Huang #include "llvm/DebugInfo/PDB/PDB.h"
13641ae73fSAmy Huang #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
14641ae73fSAmy Huang #include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h"
15*eb4c8608Sserge-sans-paille #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
1623609331SAmy Huang #include "llvm/Support/Path.h"
1723609331SAmy Huang 
1823609331SAmy Huang #include "llvm/Testing/Support/Error.h"
1923609331SAmy Huang 
2023609331SAmy Huang #include "gtest/gtest.h"
2123609331SAmy Huang 
2223609331SAmy Huang #include <vector>
2323609331SAmy Huang 
2423609331SAmy Huang using namespace llvm;
2523609331SAmy Huang using namespace llvm::pdb;
2623609331SAmy Huang 
2723609331SAmy Huang extern const char *TestMainArgv0;
2823609331SAmy Huang 
getExePath()2923609331SAmy Huang static std::string getExePath() {
3023609331SAmy Huang   SmallString<128> InputsDir = unittest::getInputFileDirectory(TestMainArgv0);
3123609331SAmy Huang   llvm::sys::path::append(InputsDir, "SimpleTest.exe");
3223609331SAmy Huang   return std::string(InputsDir);
3323609331SAmy Huang }
3423609331SAmy Huang 
TEST(NativeSessionTest,TestCreateFromExe)3523609331SAmy Huang TEST(NativeSessionTest, TestCreateFromExe) {
3623609331SAmy Huang   std::unique_ptr<IPDBSession> S;
37641ae73fSAmy Huang   std::string ExePath = getExePath();
38641ae73fSAmy Huang   Expected<std::string> PdbPath = NativeSession::searchForPdb({ExePath});
39641ae73fSAmy Huang   ASSERT_TRUE((bool)PdbPath);
40641ae73fSAmy Huang 
41641ae73fSAmy Huang   Error E = NativeSession::createFromPdbPath(PdbPath.get(), S);
4223609331SAmy Huang   ASSERT_THAT_ERROR(std::move(E), Succeeded());
4323609331SAmy Huang }
4423609331SAmy Huang 
TEST(NativeSessionTest,TestSetLoadAddress)4523609331SAmy Huang TEST(NativeSessionTest, TestSetLoadAddress) {
4623609331SAmy Huang   std::unique_ptr<IPDBSession> S;
4723609331SAmy Huang   Error E = pdb::loadDataForEXE(PDB_ReaderType::Native, getExePath(), S);
4823609331SAmy Huang   ASSERT_THAT_ERROR(std::move(E), Succeeded());
4923609331SAmy Huang 
5023609331SAmy Huang   S->setLoadAddress(123);
5123609331SAmy Huang   EXPECT_EQ(S->getLoadAddress(), 123U);
5223609331SAmy Huang }
5323609331SAmy Huang 
TEST(NativeSessionTest,TestAddressForVA)5423609331SAmy Huang TEST(NativeSessionTest, TestAddressForVA) {
5523609331SAmy Huang   std::unique_ptr<IPDBSession> S;
5623609331SAmy Huang   Error E = pdb::loadDataForEXE(PDB_ReaderType::Native, getExePath(), S);
5723609331SAmy Huang   ASSERT_THAT_ERROR(std::move(E), Succeeded());
5823609331SAmy Huang 
5923609331SAmy Huang   uint64_t LoadAddr = S->getLoadAddress();
6023609331SAmy Huang   uint32_t Section;
6123609331SAmy Huang   uint32_t Offset;
6223609331SAmy Huang   ASSERT_TRUE(S->addressForVA(LoadAddr + 5000, Section, Offset));
6323609331SAmy Huang   EXPECT_EQ(1U, Section);
6423609331SAmy Huang   EXPECT_EQ(904U, Offset);
6523609331SAmy Huang 
6623609331SAmy Huang   ASSERT_TRUE(S->addressForVA(-1, Section, Offset));
6723609331SAmy Huang   EXPECT_EQ(0U, Section);
6823609331SAmy Huang   EXPECT_EQ(0U, Offset);
6923609331SAmy Huang 
7023609331SAmy Huang   ASSERT_TRUE(S->addressForVA(4, Section, Offset));
7123609331SAmy Huang   EXPECT_EQ(0U, Section);
7223609331SAmy Huang   EXPECT_EQ(4U, Offset);
7323609331SAmy Huang 
7423609331SAmy Huang   ASSERT_TRUE(S->addressForVA(LoadAddr + 100000, Section, Offset));
7523609331SAmy Huang   EXPECT_EQ(3U, Section);
7623609331SAmy Huang   EXPECT_EQ(83616U, Offset);
7723609331SAmy Huang }
7823609331SAmy Huang 
TEST(NativeSessionTest,TestAddressForRVA)7923609331SAmy Huang TEST(NativeSessionTest, TestAddressForRVA) {
8023609331SAmy Huang   std::unique_ptr<IPDBSession> S;
8123609331SAmy Huang   Error E = pdb::loadDataForEXE(PDB_ReaderType::Native, getExePath(), S);
8223609331SAmy Huang   ASSERT_THAT_ERROR(std::move(E), Succeeded());
8323609331SAmy Huang 
8423609331SAmy Huang   uint32_t Section;
8523609331SAmy Huang   uint32_t Offset;
8623609331SAmy Huang   ASSERT_TRUE(S->addressForVA(5000, Section, Offset));
8723609331SAmy Huang   EXPECT_EQ(1U, Section);
8823609331SAmy Huang   EXPECT_EQ(904U, Offset);
8923609331SAmy Huang 
9023609331SAmy Huang   ASSERT_TRUE(S->addressForVA(-1, Section, Offset));
9123609331SAmy Huang   EXPECT_EQ(0U, Section);
9223609331SAmy Huang   EXPECT_EQ(0U, Offset);
9323609331SAmy Huang 
9423609331SAmy Huang   ASSERT_TRUE(S->addressForVA(4, Section, Offset));
9523609331SAmy Huang   EXPECT_EQ(0U, Section);
9623609331SAmy Huang   EXPECT_EQ(4U, Offset);
9723609331SAmy Huang 
9823609331SAmy Huang   ASSERT_TRUE(S->addressForVA(100000, Section, Offset));
9923609331SAmy Huang   EXPECT_EQ(3U, Section);
10023609331SAmy Huang   EXPECT_EQ(83616U, Offset);
10123609331SAmy Huang }
102