diff --git a/api/python/src/Abstract/pyBinary.cpp b/api/python/src/Abstract/pyBinary.cpp index b036a8808..6fcc8eb43 100644 --- a/api/python/src/Abstract/pyBinary.cpp +++ b/api/python/src/Abstract/pyBinary.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -380,7 +381,7 @@ void create(nb::module_& m) { ) .def("assemble", - [] (Binary& self, uint64_t address, const std::string& Asm, + [] (Binary& self, uint64_t address, std::string_view Asm, assembly::AssemblerConfig& config) { return nb::to_bytes(self.assemble(address, Asm, config)); diff --git a/api/python/src/asm/pyAssemblerConfig.cpp b/api/python/src/asm/pyAssemblerConfig.cpp index f2d9a24ff..07f83acb9 100644 --- a/api/python/src/asm/pyAssemblerConfig.cpp +++ b/api/python/src/asm/pyAssemblerConfig.cpp @@ -1,7 +1,7 @@ #include "LIEF/asm/AssemblerConfig.hpp" #include "asm/pyAssembly.hpp" -#include +#include #include #include @@ -11,7 +11,7 @@ class PyAssemblerConfig : public assembly::AssemblerConfig { public: NB_TRAMPOLINE(assembly::AssemblerConfig); - std::optional resolve_symbol(const std::string& name) override { + std::optional resolve_symbol(std::string_view name) override { NB_OVERRIDE(resolve_symbol, name); } diff --git a/api/python/src/asm/pyInstruction.cpp b/api/python/src/asm/pyInstruction.cpp index b0b441245..0e83a8179 100644 --- a/api/python/src/asm/pyInstruction.cpp +++ b/api/python/src/asm/pyInstruction.cpp @@ -7,6 +7,7 @@ #include "asm/pyAssembly.hpp" #include +#include #include #include "nanobind/utils.hpp" diff --git a/api/python/src/runtime/objects/pyAssembler.cpp b/api/python/src/runtime/objects/pyAssembler.cpp index 081b66a12..3f731f17b 100644 --- a/api/python/src/runtime/objects/pyAssembler.cpp +++ b/api/python/src/runtime/objects/pyAssembler.cpp @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include +#include #include "LIEF/runtime/assembler.hpp" #include "LIEF/asm/AssemblerConfig.hpp" @@ -23,7 +23,7 @@ namespace LIEF::runtime::py { void init_assembler(nb::module_& m) { m.def("assemble", - [] (uint64_t address, const std::string& Asm, + [] (uint64_t address, std::string_view Asm, assembly::AssemblerConfig& config) { return nb::to_bytes(runtime::assemble(address, Asm, config)); diff --git a/api/rust/cmake-ffi/rust_cpp_bridge.cpp b/api/rust/cmake-ffi/rust_cpp_bridge.cpp index 1e6f44c01..4de66d18e 100644 --- a/api/rust/cmake-ffi/rust_cpp_bridge.cpp +++ b/api/rust/cmake-ffi/rust_cpp_bridge.cpp @@ -2,6 +2,7 @@ #include "LIEF/rust/asm/AssemblerConfig.hpp" +#include #include class RustAssemblerConfig : public LIEF::assembly::AssemblerConfig { @@ -10,8 +11,8 @@ class RustAssemblerConfig : public LIEF::assembly::AssemblerConfig { LIEF::assembly::AssemblerConfig(), impl_(const_cast(&impl)) {} - std::optional resolve_symbol(const std::string& name) override { - int64_t addr = impl_->resolve_symbol(name); + std::optional resolve_symbol(std::string_view name) override { + int64_t addr = impl_->resolve_symbol(rust::Str(name.data(), name.size())); if (addr < 0) { return std::nullopt; } diff --git a/doc/code/cpp/assembler.cpp b/doc/code/cpp/assembler.cpp index 3b10dcfe2..1f6a2a471 100644 --- a/doc/code/cpp/assembler.cpp +++ b/doc/code/cpp/assembler.cpp @@ -43,7 +43,7 @@ void config_resolver() { // lief-doc: config-resolver-start class MyConfig : public LIEF::assembly::AssemblerConfig { public: - std::optional resolve_symbol(const std::string& name) override { + std::optional resolve_symbol(std::string_view name) override { if (name == "a_custom_function") { return 0x1000; } @@ -72,8 +72,8 @@ void config_target() { LIEF::assembly::AssemblerConfig(), target_(&target) {} - std::optional resolve_symbol(const std::string& name) override { - if (auto addr = target_->get_function_address(name)) { + std::optional resolve_symbol(std::string_view name) override { + if (auto addr = target_->get_function_address(std::string(name))) { return *addr; } return std::nullopt; diff --git a/doc/sphinx/runtime/cpp.md b/doc/sphinx/runtime/cpp.md index 1fafa303c..af5ca8a2b 100644 --- a/doc/sphinx/runtime/cpp.md +++ b/doc/sphinx/runtime/cpp.md @@ -19,7 +19,7 @@ ``` ```{eval-rst} -.. doxygenfunction:: LIEF::runtime::assemble(uint64_t, const std::string&, assembly::AssemblerConfig&) +.. doxygenfunction:: LIEF::runtime::assemble(uint64_t, std::string_view, assembly::AssemblerConfig&) ``` ```{eval-rst} diff --git a/examples/cpp/runtime_android.cpp b/examples/cpp/runtime_android.cpp index 18df7a533..09ce62d04 100644 --- a/examples/cpp/runtime_android.cpp +++ b/examples/cpp/runtime_android.cpp @@ -158,7 +158,7 @@ void memory_example() { } struct Config : LIEF::assembly::AssemblerConfig { - std::optional resolve_symbol(const std::string& name) override { + std::optional resolve_symbol(std::string_view name) override { std::unique_ptr libc = LIEF::runtime::android::dlopen("libc.so"); if (libc == nullptr) { diff --git a/examples/cpp/runtime_osx.cpp b/examples/cpp/runtime_osx.cpp index 33ee8df02..f73881030 100644 --- a/examples/cpp/runtime_osx.cpp +++ b/examples/cpp/runtime_osx.cpp @@ -154,7 +154,7 @@ void memory_example() { class Config : public LIEF::assembly::AssemblerConfig { public: - std::optional resolve_symbol(const std::string& name) override { + std::optional resolve_symbol(std::string_view name) override { // The message to print static constexpr char HELLO[] = "Hello World\n"; static constexpr uint32_t HELLO_LEN = sizeof(HELLO) - 1; diff --git a/examples/cpp/runtime_windows.cpp b/examples/cpp/runtime_windows.cpp index 136a3985d..25a2dbd30 100644 --- a/examples/cpp/runtime_windows.cpp +++ b/examples/cpp/runtime_windows.cpp @@ -210,7 +210,7 @@ void memory_example() { class Config : public LIEF::assembly::AssemblerConfig { public: - std::optional resolve_symbol(const std::string& name) override { + std::optional resolve_symbol(std::string_view name) override { // The message to print static constexpr char HELLO[] = "Hello World\n"; static constexpr uint32_t HELLO_LEN = sizeof(HELLO) - 1; diff --git a/include/LIEF/Abstract/Binary.hpp b/include/LIEF/Abstract/Binary.hpp index a77824d7b..d7a51bb65 100644 --- a/include/LIEF/Abstract/Binary.hpp +++ b/include/LIEF/Abstract/Binary.hpp @@ -16,6 +16,7 @@ #ifndef LIEF_ABSTRACT_BINARY_H #define LIEF_ABSTRACT_BINARY_H +#include #include #include #include @@ -384,7 +385,7 @@ class LIEF_API Binary : public Object { /// /// If you need to configure the assembly engine or to define addresses for /// symbols, you can provide your own assembly::AssemblerConfig. - std::vector assemble(uint64_t address, const std::string& Asm, + std::vector assemble(uint64_t address, std::string_view Asm, assembly::AssemblerConfig& config = assembly::AssemblerConfig::default_config()); diff --git a/include/LIEF/asm/AssemblerConfig.hpp b/include/LIEF/asm/AssemblerConfig.hpp index fc0fee652..8456f0c50 100644 --- a/include/LIEF/asm/AssemblerConfig.hpp +++ b/include/LIEF/asm/AssemblerConfig.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include namespace LIEF::assembly { @@ -71,7 +71,7 @@ class LIEF_API AssemblerConfig { /// ```cpp /// class MyConfig : public AssemblerConfig { /// public: - /// std::optional resolve_symbol(const std::string& name) { + /// std::optional resolve_symbol(std::string_view name) override { /// if (name == "_my_function") { /// return 0x4000; /// } @@ -79,7 +79,7 @@ class LIEF_API AssemblerConfig { /// } /// }; /// ``` - virtual std::optional resolve_symbol(const std::string& /*name*/) { + virtual std::optional resolve_symbol(std::string_view /*name*/) { return std::nullopt; } diff --git a/include/LIEF/asm/Engine.hpp b/include/LIEF/asm/Engine.hpp index bef358d6e..e158c22ba 100644 --- a/include/LIEF/asm/Engine.hpp +++ b/include/LIEF/asm/Engine.hpp @@ -21,6 +21,7 @@ #include "LIEF/asm/AssemblerConfig.hpp" #include "LIEF/asm/Instruction.hpp" +#include #include namespace LIEF { @@ -59,11 +60,11 @@ class LIEF_API Engine { } std::vector - assemble(uint64_t address, const std::string& Asm, + assemble(uint64_t address, std::string_view Asm, AssemblerConfig& config = AssemblerConfig::default_config()); std::vector - assemble(uint64_t address, const std::string& Asm, LIEF::Binary& bin, + assemble(uint64_t address, std::string_view Asm, LIEF::Binary& bin, AssemblerConfig& config = AssemblerConfig::default_config()); std::vector assemble(const llvm::MCInst& inst); diff --git a/include/LIEF/asm/Instruction.hpp b/include/LIEF/asm/Instruction.hpp index 07a624b57..ce9f043b5 100644 --- a/include/LIEF/asm/Instruction.hpp +++ b/include/LIEF/asm/Instruction.hpp @@ -19,6 +19,7 @@ #include "LIEF/iterators.hpp" #include "LIEF/visibility.h" +#include #include #include #include @@ -102,7 +103,7 @@ class LIEF_API Instruction { const std::vector& raw() const LIEF_LIFETIMEBOUND; /// Instruction mnemonic (e.g. `br`) - std::string mnemonic() const; + std::string_view mnemonic() const LIEF_LIFETIMEBOUND; /// Representation of the current instruction in a pretty assembly way std::string to_string(bool with_address = true) const; diff --git a/include/LIEF/runtime/assembler.hpp b/include/LIEF/runtime/assembler.hpp index ce346fda2..4e67a9ad1 100644 --- a/include/LIEF/runtime/assembler.hpp +++ b/include/LIEF/runtime/assembler.hpp @@ -16,6 +16,7 @@ #ifndef LIEF_RUNTIME_ASSEMBLER_H #define LIEF_RUNTIME_ASSEMBLER_H #include "LIEF/visibility.h" +#include #include #include "LIEF/asm/AssemblerConfig.hpp" @@ -44,7 +45,7 @@ namespace LIEF::runtime { /// If you need to configure the assembly engine or to define addresses for /// symbols, you can provide your own assembly::AssemblerConfig instance. LIEF_API std::vector assemble( - uint64_t addr, const std::string& Asm, + uint64_t addr, std::string_view Asm, assembly::AssemblerConfig& config = assembly::AssemblerConfig::default_config() ); diff --git a/src/asm/asm.cpp b/src/asm/asm.cpp index 84788ef3e..f82b6435e 100644 --- a/src/asm/asm.cpp +++ b/src/asm/asm.cpp @@ -152,7 +152,7 @@ Binary::instructions_it Binary::disassemble(const uint8_t*, size_t, } std::vector Binary::assemble(uint64_t /*address*/, - const std::string& /*Asm*/, + std::string_view /*Asm*/, assembly::AssemblerConfig& /*config*/) { LIEF_ERR(ASSEMBLY_NOT_SUPPORTED); return {}; @@ -271,7 +271,7 @@ const std::vector& Instruction::raw() const { return empty; } -std::string Instruction::mnemonic() const { +std::string_view Instruction::mnemonic() const { return ""; } @@ -361,13 +361,13 @@ Engine::instructions_it Engine::disassemble(const uint8_t*, size_t, uint64_t) { } std::vector Engine::assemble(uint64_t /*address*/, - const std::string& /*Asm*/, + std::string_view /*Asm*/, AssemblerConfig& /*config*/) { return {}; } std::vector Engine::assemble(uint64_t /*address*/, - const std::string& /*Asm*/, + std::string_view /*Asm*/, LIEF::Binary& /*bin*/, AssemblerConfig& /*config*/) { return {}; diff --git a/src/runtime/disassembler/no_assembler.cpp b/src/runtime/disassembler/no_assembler.cpp index 1c17c58ba..b448b5571 100644 --- a/src/runtime/disassembler/no_assembler.cpp +++ b/src/runtime/disassembler/no_assembler.cpp @@ -6,7 +6,7 @@ #include "messages.hpp" namespace LIEF::runtime { -std::vector assemble(uint64_t /*addr*/, const std::string& /*Asm*/, +std::vector assemble(uint64_t /*addr*/, std::string_view /*Asm*/, assembly::AssemblerConfig& /*config*/) { LIEF_ERR(ASSEMBLY_NOT_SUPPORTED); return {};