LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
DWARF/editor/Function.hpp
Go to the documentation of this file.
1/* Copyright 2022 - 2026 R. Thomas
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#ifndef LIEF_DWARF_EDITOR_FUNCTION_H
16#define LIEF_DWARF_EDITOR_FUNCTION_H
17#include <cstdint>
18#include <memory>
19#include <vector>
20#include <string>
21
23#include "LIEF/visibility.h"
24
25namespace LIEF {
26namespace dwarf {
27namespace editor {
28class Type;
29class Variable;
30
31namespace details {
32class Function;
33class FunctionParameter;
34class FunctionLexicalBlock;
35class FunctionLabel;
36}
37
40 public:
42 range_t() = default;
43 range_t(uint64_t start, uint64_t end) :
44 start(start),
45 end(end) {}
46 uint64_t start = 0;
47 uint64_t end = 0;
48 };
49
53 public:
54 Parameter() = delete;
55 Parameter(std::unique_ptr<details::FunctionParameter> impl);
56
58
60 Parameter& assign_register(const std::string& name) LIEF_LIFETIMEBOUND;
61
64
65 private:
66 std::unique_ptr<details::FunctionParameter> impl_;
67 };
68
71 public:
72 LexicalBlock() = delete;
73 LexicalBlock(std::unique_ptr<details::FunctionLexicalBlock> impl);
74
76 std::unique_ptr<LexicalBlock> add_block(uint64_t start,
77 uint64_t end) LIEF_LIFETIMEBOUND;
78
80 std::unique_ptr<LexicalBlock>
81 add_block(const std::vector<range_t>& range) LIEF_LIFETIMEBOUND;
82
86 add_description(const std::string& description) LIEF_LIFETIMEBOUND;
87
89 LexicalBlock& add_name(const std::string& name) LIEF_LIFETIMEBOUND;
90
92
93 private:
94 std::unique_ptr<details::FunctionLexicalBlock> impl_;
95 };
96
99 public:
100 Label() = delete;
101 Label(std::unique_ptr<details::FunctionLabel> impl);
102
104
105 private:
106 std::unique_ptr<details::FunctionLabel> impl_;
107 };
108
109 Function() = delete;
110 Function(std::unique_ptr<details::Function> impl);
111
114
119 Function& set_low_high(uint64_t low, uint64_t high) LIEF_LIFETIMEBOUND;
120
125 Function& set_ranges(const std::vector<range_t>& ranges) LIEF_LIFETIMEBOUND;
126
131
134
136 std::unique_ptr<Parameter> add_parameter(const std::string& name,
137 const Type& type) LIEF_LIFETIMEBOUND;
138
140 std::unique_ptr<Variable>
142
144 std::unique_ptr<LexicalBlock> add_lexical_block(uint64_t start,
145 uint64_t end) LIEF_LIFETIMEBOUND;
146
148 std::unique_ptr<Label> add_label(uint64_t addr,
149 const std::string& label) LIEF_LIFETIMEBOUND;
150
153 Function& add_description(const std::string& description) LIEF_LIFETIMEBOUND;
154
156
157 private:
158 std::unique_ptr<details::Function> impl_;
159};
160
161}
162}
163}
164#endif
This class mirrors the DW_TAG_label DWARF tag.
Definition DWARF/editor/Function.hpp:98
Label(std::unique_ptr< details::FunctionLabel > impl)
This class mirrors the DW_TAG_lexical_block DWARF tag.
Definition DWARF/editor/Function.hpp:70
LexicalBlock & add_name(const std::string &name)
Create a DW_AT_name entry to associate a name to this entry.
std::unique_ptr< LexicalBlock > add_block(const std::vector< range_t > &range)
Create a sub-block with the given range of addresses.
LexicalBlock(std::unique_ptr< details::FunctionLexicalBlock > impl)
LexicalBlock & add_description(const std::string &description)
Create a DW_AT_description entry with the description provided in parameter.
std::unique_ptr< LexicalBlock > add_block(uint64_t start, uint64_t end)
Create a sub-block with the given low/high addresses.
This class represents a parameter of the current function (DW_TAG_formal_parameter).
Definition DWARF/editor/Function.hpp:52
Parameter(std::unique_ptr< details::FunctionParameter > impl)
Parameter & assign_register(const std::string &name)
Assign this parameter to a specific named register.
Parameter & assign_register(uint64_t reg)
Assign this parameter to the given DWARF register id (e.g. DW_OP_reg0).
Function(std::unique_ptr< details::Function > impl)
std::unique_ptr< Label > add_label(uint64_t addr, const std::string &label)
Add a label at the given address.
Function & set_external()
Set the function as external by defining DW_AT_external to true. This means that the function is impo...
Function & set_return_type(const Type &type)
Set the return type of this function.
std::unique_ptr< Variable > create_stack_variable(const std::string &name)
Create a stack-based variable owned by the current function.
Function & set_ranges(const std::vector< range_t > &ranges)
Set the ranges of addresses owned by the implementation of this function by setting the DW_AT_ranges ...
std::unique_ptr< Parameter > add_parameter(const std::string &name, const Type &type)
Add a parameter to the current function.
Function & set_low_high(uint64_t low, uint64_t high)
Set the upper and lower bound addresses for this function. This assumes that the function is contiguo...
Function & set_address(uint64_t addr)
Set the address of this function by defining DW_AT_entry_pc.
std::unique_ptr< LexicalBlock > add_lexical_block(uint64_t start, uint64_t end)
Add a lexical block with the given range.
Function & add_description(const std::string &description)
Create a DW_AT_description entry with the description provided in parameter.
This class is the base class for any types created when editing DWARF debug info.
Definition DWARF/editor/Type.hpp:37
This class represents an editable DWARF variable which can be scoped by a function or a compilation u...
Definition editor/Variable.hpp:35
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
Definition DWARF/editor/CompilationUnit.hpp:38
Definition Editor.hpp:32
Namespace for the DWARF debug format.
Definition DWARF/CompilationUnit.hpp:30
LIEF namespace.
Definition Abstract/Binary.hpp:41
uint64_t end
Definition DWARF/editor/Function.hpp:47
range_t(uint64_t start, uint64_t end)
Definition DWARF/editor/Function.hpp:43
uint64_t start
Definition DWARF/editor/Function.hpp:46
#define LIEF_API
Definition visibility.h:45