Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@
#include "rocprof-sys-causal.hpp"

#include "common/defines.h"
#include "common/delimit.hpp"
#include "common/environment.hpp"
#include "common/join.hpp"
#include "common/setup.hpp"
#include "common/path.hpp"
#include "core/mproc.hpp"
#include "core/utility.hpp"

Expand All @@ -38,8 +37,6 @@
#include <timemory/utility/filepath.hpp>
#include <timemory/utility/join.hpp>

#include <array>
#include <chrono>
#include <cmath>
#include <cstdint>
#include <cstdio>
Expand All @@ -52,14 +49,14 @@
#include <string>
#include <string_view>
#include <sys/wait.h>
#include <thread>
#include <unistd.h>
#include <vector>

namespace color = ::tim::log::color;
namespace filepath = ::tim::filepath;
namespace console = ::tim::utility::console;
namespace argparse = ::tim::argparse;
namespace path = rocprofsys::common::path;
using namespace ::timemory::join;
using ::rocprofsys::utility::parse_numeric_range;
using ::tim::get_env;
Expand All @@ -78,9 +75,9 @@ to_string(bool _v)
namespace
{
int verbose = 0;
auto updated_envs = std::set<std::string_view>{};
auto original_envs = std::set<std::string>{};
auto child_pids = std::set<pid_t>{};
auto updated_envs = std::unordered_set<std::string_view>{};
auto original_envs = std::unordered_set<std::string>{};
auto child_pids = std::unordered_set<pid_t>{};
auto launcher = std::string{};

inline signal_handler&
Expand Down Expand Up @@ -160,15 +157,6 @@ diagnose_status(pid_t _pid, int _status)
return ::rocprofsys::mproc::diagnose_status(_pid, _status, get_verbose());
}

std::string
get_realpath(const std::string& _v)
{
auto* _tmp = realpath(_v.c_str(), nullptr);
auto _ret = std::string{ _tmp };
free(_tmp);
return _ret;
}

void
print_command(const std::vector<char*>& _argv, std::string_view _prefix)
{
Expand Down Expand Up @@ -250,45 +238,16 @@ prepare_environment_for_run(std::vector<char*>& _env)
{
if(launcher.empty())
{
update_env(_env, "LD_PRELOAD",
join(":", LIBPTHREAD_SO,
get_realpath(get_internal_libpath("librocprof-sys-dl.so"))),
true);
update_env(_env, "ROCPROFSYS_SCRIPT_DIR", get_internal_script_path());
update_env(_env, "ROCPROFSYS_ROOT", get_rocprofsys_root());
update_env(
_env, "LD_PRELOAD",
join(":", LIBPTHREAD_SO,
path::realpath(path::get_internal_libpath("librocprof-sys-dl.so"))),
true);
update_env(_env, "ROCPROFSYS_SCRIPT_DIR", path::get_internal_script_path());
update_env(_env, "ROCPROFSYS_ROOT", path::get_rocprofsys_root());
}
}

std::string
get_rocprofsys_root(void)
{
char* _tmp = realpath("/proc/self/exe", nullptr);
std::string _exe = (_tmp) ? std::string{ _tmp } : std::string{};

if(_tmp) free(_tmp);

auto _pos = _exe.find_last_of('/');
auto _dir = std::string{ "./" };

if(_pos != std::string::npos) _dir = _exe.substr(0, _pos);

return rocprofsys::common::join("/", _dir, "..");
}

std::string
get_internal_libpath(const std::string& _lib)
{
auto _root = get_rocprofsys_root();
return rocprofsys::common::join("/", _root, "lib", _lib);
}

std::string
get_internal_script_path(void)
{
auto _root = get_rocprofsys_root();
return rocprofsys::common::join("/", _root, "libexec", "rocprofiler-systems");
}

void
print_updated_environment(std::vector<char*> _env, std::string_view _prefix)
{
Expand Down Expand Up @@ -398,22 +357,6 @@ add_default_env(std::vector<char*>& _environ, std::string_view _env_var, Tp&& _e
strdup(rocprofsys::common::join('=', _env_var, _env_val).c_str()));
}

void
remove_env(std::vector<char*>& _environ, std::string_view _env_var)
{
auto _key = join("", _env_var, "=");
auto _match = [&_key](auto itr) { return std::string_view{ itr }.find(_key) == 0; };

_environ.erase(std::remove_if(_environ.begin(), _environ.end(), _match),
_environ.end());

for(const auto& itr : original_envs)
{
if(std::string_view{ itr }.find(_key) == 0)
_environ.emplace_back(strdup(itr.c_str()));
}
}

std::vector<char*>
parse_args(int argc, char** argv, std::vector<char*>& _env,
std::vector<std::map<std::string_view, std::string>>& _causal_envs)
Expand All @@ -422,7 +365,7 @@ parse_args(int argc, char** argv, std::vector<char*>& _env,
using parser_err_t = typename parser_t::result_type;

auto help_check = [](parser_t& p, int _argc, char** _argv) {
std::set<std::string> help_args = { "-h", "--help", "-?" };
std::unordered_set<std::string> help_args = { "-h", "--help", "-?" };
return (p.exists("help") || _argc == 1 ||
(_argc > 1 && help_args.find(_argv[1]) != help_args.end()));
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

#include <timemory/log/macros.hpp>

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@
int
get_verbose();

std::string
get_realpath(const std::string&);

void
print_command(const std::vector<char*>& _argv, std::string_view);

Expand All @@ -52,15 +49,6 @@ prepare_command_for_run(char*, std::vector<char*>&);
void
prepare_environment_for_run(std::vector<char*>&);

std::string
get_rocprofsys_root(void);

std::string
get_internal_libpath(const std::string& _lib);

std::string
get_internal_script_path(void);

template <typename Tp>
void
update_env(std::vector<char*>&, std::string_view, Tp&&, bool _append = false,
Expand All @@ -70,9 +58,6 @@ template <typename Tp>
void
add_default_env(std::vector<char*>&, std::string_view, Tp&&);

void
remove_env(std::vector<char*>&, std::string_view);

std::vector<char*>
parse_args(int argc, char** argv, std::vector<char*>&,
std::vector<std::map<std::string_view, std::string>>&);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "rocprof-sys-instrument.hpp"
#include "common/defines.h"
#include "common/join.hpp"
#include "common/path.hpp"
#include "dl/dl.hpp"
#include "fwd.hpp"
#include "internal_libs.hpp"
Expand All @@ -43,7 +44,6 @@
#include <timemory/utility/signals.hpp>

#include <algorithm>
#include <chrono>
#include <csignal>
#include <cstddef>
#include <cstdint>
Expand Down Expand Up @@ -159,6 +159,7 @@ namespace
namespace process = tim::process; // NOLINT
namespace signals = tim::signals;
namespace filepath = tim::filepath;
namespace path = rocprofsys::common::path;

using signal_settings = tim::signals::signal_settings;
using sys_signal = tim::signals::sys_signal;
Expand Down Expand Up @@ -192,25 +193,17 @@ strset_t print_formats = { "txt", "json
std::string modfunc_dump_dir = {};
auto regex_opts = std::regex_constants::egrep | std::regex_constants::optimize;

std::string
get_internal_libpath()
{
auto _exe = std::string_view{ ::realpath("/proc/self/exe", nullptr) };
auto _pos = _exe.find_last_of('/');
auto _dir = std::string{ "./" };
if(_pos != std::string_view::npos) _dir = _exe.substr(0, _pos);
return rocprofsys::common::join("/", _dir, "..", "lib");
}

strvec_t lib_search_paths = tim::delimit(
JOIN(':', get_internal_libpath(), tim::get_env<std::string>("DYNINSTAPI_RT_LIB"),
tim::get_env<std::string>("DYNINST_REWRITER_PATHS"),
tim::get_env<std::string>("LD_LIBRARY_PATH")),
":");
strvec_t lib_search_paths =
tim::delimit(rocprofsys::join(':', path::get_internal_libdir(),
tim::get_env<std::string>("DYNINSTAPI_RT_LIB"),
tim::get_env<std::string>("DYNINST_REWRITER_PATHS"),
tim::get_env<std::string>("LD_LIBRARY_PATH")),
":");
strvec_t bin_search_paths = tim::delimit(tim::get_env<std::string>("PATH"), ":");

auto _dyn_api_rt_paths = tim::delimit(
JOIN(":", get_internal_libpath(), JOIN("/", get_internal_libpath(), "rocprofsys")),
rocprofsys::join(":", path::get_internal_libdir(),
rocprofsys::join("/", path::get_internal_libdir(), "rocprofsys")),
":");

std::string
Expand All @@ -234,9 +227,6 @@ is_file(std::string _name);
bool
is_directory(std::string _name);

std::string
get_realpath(const std::string&);

std::string
get_cwd();

Expand Down Expand Up @@ -334,10 +324,10 @@ main(int argc, char** argv)
"::", "rocprofiler-systems root path: ", _omni_root);
}

auto _omni_exe_path = get_realpath(get_absolute_exe_filepath(argv[0]));
auto _omni_exe_path = path::realpath(get_absolute_exe_filepath(argv[0]));
if(!exists(_omni_exe_path))
_omni_exe_path =
get_realpath(get_absolute_exe_filepath(rocprofsys_get_exe_realpath()));
path::realpath(get_absolute_exe_filepath(rocprofsys_get_exe_realpath()));
bin_search_paths.emplace_back(filepath::dirname(_omni_exe_path));

auto _omni_lib_path =
Expand Down Expand Up @@ -464,7 +454,7 @@ main(int argc, char** argv)

if(_cmdc > 0 && !mutname.empty())
{
auto resolved_mutname = get_realpath(get_absolute_filepath(mutname));
auto resolved_mutname = path::realpath(get_absolute_filepath(mutname));
if(resolved_mutname != mutname)
{
mutname = resolved_mutname;
Expand Down Expand Up @@ -670,7 +660,7 @@ main(int argc, char** argv)
p.print_help(extra_help);
std::exit(EXIT_FAILURE);
}
keys.at(0) = get_realpath(get_absolute_filepath(keys.at(0)));
keys.at(0) = path::realpath(get_absolute_filepath(keys.at(0)));
mutname = keys.at(0);
_cmdc = keys.size();
_cmdv = new char*[_cmdc];
Expand Down Expand Up @@ -1184,7 +1174,7 @@ main(int argc, char** argv)
!parser.exists("min-instructions") &&
!parser.exists("min-address-range-loop"));

auto _rocprofsys_exe_path = tim::dirname(::get_realpath("/proc/self/exe"));
auto _rocprofsys_exe_path = tim::dirname(path::realpath("/proc/self/exe"));
verbprintf(4, "rocprof-sys exe path: %s\n", _rocprofsys_exe_path.c_str());

if(_cmdv && _cmdv[0] && strlen(_cmdv[0]) > 0)
Expand Down Expand Up @@ -1232,7 +1222,7 @@ main(int argc, char** argv)

if(binary_rewrite && outfile.empty())
{
auto _is_local = (get_realpath(cmdv0) ==
auto _is_local = (path::realpath(cmdv0) ==
TIMEMORY_JOIN('/', get_cwd(), ::basename(cmdv0.c_str())));
auto _cmd = std::string{ ::basename(cmdv0.c_str()) };
if(_cmd.find('.') == std::string::npos)
Expand Down Expand Up @@ -1481,8 +1471,8 @@ main(int argc, char** argv)
image_t* app_image = addr_space->getImage();
std::vector<module_t*>* app_modules = app_image->getModules();
std::vector<procedure_t*>* app_functions = app_image->getProcedures(include_uninstr);
std::set<module_t*> modules = {};
std::set<procedure_t*> functions = {};
std::unordered_set<module_t*> modules = {};
std::unordered_set<procedure_t*> functions = {};

if(app_modules) process_modules(*app_modules);

Expand Down Expand Up @@ -1655,7 +1645,7 @@ main(int argc, char** argv)
for(auto _libname : _libnames)
{
ROCPROFSYS_ADD_LOG_ENTRY("Getting the absolute lib filepath to", _libname);
_libname = get_realpath(get_absolute_lib_filepath(_libname));
_libname = path::realpath(get_absolute_lib_filepath(_libname));
_tried_libs += string_t("|") + _libname;
verbprintf(1, "loading library: '%s'...\n", _libname.c_str());
result = (addr_space->loadLibrary(_libname.c_str()) != nullptr);
Expand Down Expand Up @@ -2843,25 +2833,19 @@ exists(const std::string& name)
bool
is_file(std::string _name)
{
_name = get_realpath(_name);
_name = path::realpath(_name);
struct stat buffer;
return (stat(_name.c_str(), &buffer) == 0 && S_ISREG(buffer.st_mode) != 0);
}

bool
is_directory(std::string _name)
{
_name = get_realpath(_name);
_name = path::realpath(_name);
struct stat buffer;
return (stat(_name.c_str(), &buffer) == 0 && S_ISDIR(buffer.st_mode) != 0);
}

std::string
get_realpath(const std::string& _f)
{
return filepath::realpath(_f, nullptr, false);
}

std::string
get_cwd()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include <timemory/utility/join.hpp>

#include <dlfcn.h>
#include <ios>
#include <string>
#include <sys/stat.h>
#include <unistd.h>
Expand Down
Loading