Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'upstream/master' into llvm-6.0
Browse files Browse the repository at this point in the history
gitoleg committed Mar 15, 2018
2 parents 98b066d + 2f6e0bd commit 5880630
Showing 7 changed files with 35 additions and 34 deletions.
26 changes: 15 additions & 11 deletions lib/bap_image/bap_image.ml
Original file line number Diff line number Diff line change
@@ -175,14 +175,14 @@ let tag mem tag value memmap =
let map_region data {locn={addr}; info={off; len; endian}} =
Memory.create ~pos:off ~len endian addr data

let static_view segments = function {addr; size} as locn ->
let static_view segments = function {addr} as locn ->
match Table.find_addr segments addr with
| None -> Result.failf "region is not mapped to memory" ()
| Some (segmem,_) -> mem_of_locn segmem locn

let add_sym segments memory (symtab : symtab)
({name; locn=entry; info={kind; extra_locns=locns}} as sym) =
static_view segments entry >>= fun entry_region ->
({name; locn=entry; info={extra_locns=locns}} as sym) =
static_view segments entry >>= fun _entry_region ->
Result.List.fold (entry::locns) ~init:(memory,symtab)
~f:(fun (memory,symtab) locn ->
static_view segments locn >>= fun mem ->
@@ -192,14 +192,18 @@ let add_sym segments memory (symtab : symtab)
| Ok symtab -> Ok (memory,symtab)
| _intersects_ -> Ok (memory,symtab))

let add_segment base memory segments : segment -> _ = function
{name; locn={addr;size}} as seg ->
let add_segment base memory segments seg =
map_region base seg >>= fun mem ->
Table.add segments mem seg >>= fun segments ->
let memory = tag mem segment seg memory |>
tag mem section name in
let memory = tag mem segment seg memory in
Result.return (memory,segments)

let add_sections_view segments sections memmap =
List.fold sections ~init:(memmap,[])
~f:(fun (memmap,ers) {name; locn} ->
match static_view segments locn with
| Ok mem -> tag mem section name memmap, ers
| Error er -> memmap,er::ers)

let make_table add base memory =
List.fold ~init:(memory,Table.empty,[])
@@ -254,10 +258,11 @@ let create_segment_of_symbol_table syms secs =

let from_spec query base doc =
Fact.eval query doc >>= function
{Spec.arch; entry; segments; symbols; sections} as spec ->
{Spec.segments; symbols; sections} as spec ->
let memory = Memmap.empty in
let memory,segs,seg_warns = make_segtab base memory segments in
let memory,syms,sym_warns = make_symtab segs memory symbols in
let memory,sec_warns = add_sections_view segs sections memory in
let words = create_words segs in
Table.(rev_map ~one_to:one Segment.hashable (segs : segment table)) >>=
fun (memory_of_segment : segment -> mem) ->
@@ -275,7 +280,7 @@ let from_spec query base doc =
memory_of_symbol = Lazy.from_fun memory_of_symbol;
symbols_of_segment = Lazy.from_fun symbols_of_segment;
segment_of_symbol = Lazy.from_fun segment_of_symbol;
}, (seg_warns @ sym_warns))
}, (seg_warns @ sym_warns @ sec_warns))

let data t = t.data
let memory t = t.memory
@@ -385,7 +390,6 @@ module Derive = struct

let segments : segment seq Fact.t =
endian >>= fun endian ->
addr_width >>= fun width ->
Fact.foreach Ogre.Query.(begin
select (from segment $ mapped $ named_region)
~join:[[field addr];
@@ -545,7 +549,7 @@ module Metaloader () = struct

let merge_docs d1 d2 = match Ogre.Doc.merge d1 d2 with
| Ok d3 -> Ok d3
| Error err ->
| Error _ ->
if Ogre.Doc.declarations d1 >
Ogre.Doc.declarations d2
then Ok d1
8 changes: 4 additions & 4 deletions lib/bap_llvm/llvm_coff_loader.hpp
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ void section(const coff_section &sec, uint64_t image_base, ogre_doc &s) {
s.entry("code-entry") << sec.Name << sec.PointerToRawData << sec.SizeOfRawData;
}

void symbol(const std::string &name, uint64_t relative_addr, uint64_t size, uint64_t off, SymbolRef::Type typ, ogre_doc &s) {
void symbol(const std::string &name, int64_t relative_addr, uint64_t size, uint64_t off, SymbolRef::Type typ, ogre_doc &s) {
s.entry("symbol-entry") << name << relative_addr << size << off;
if (typ == SymbolRef::ST_Function)
s.entry("code-entry") << name << off << size;
@@ -60,7 +60,7 @@ error_or<uint64_t> symbol_file_offset(const coff_obj &obj, const SymbolRef &sym)
const coff_section* get_coff_section(const coff_obj &obj, const SectionRef &sec);
error_or<int> section_number(const coff_obj &obj, const SymbolRef &sym);
error_or<uint64_t> symbol_value(const coff_obj &obj, const SymbolRef &sym);
error_or<uint64_t> symbol_relative_address(const coff_obj &obj, const SymbolRef &sym);
error_or<int64_t> symbol_relative_address(const coff_obj &obj, const SymbolRef &sym);

const coff_section * get_coff_section(const coff_obj &obj, std::size_t index) {
const coff_section *sec = nullptr;
@@ -257,7 +257,7 @@ void exported_symbols(const coff_obj &obj, ogre_doc &s) {
#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 8 \
|| LLVM_VERSION_MAJOR >= 4

error_or<uint64_t> symbol_relative_address(const coff_obj &obj, const SymbolRef &sym) {
error_or<int64_t> symbol_relative_address(const coff_obj &obj, const SymbolRef &sym) {
auto base = obj.getImageBase();
auto addr = symbol_address(obj, sym);
if (!addr) return addr;
@@ -321,7 +321,7 @@ error_or<pe32plus_header> get_pe32plus_header(const coff_obj &obj) {
#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR == 4

// symbol address for 3.4 is already relative, i.e. doesn't include image base
error_or<uint64_t> symbol_relative_address(const coff_obj &obj, const SymbolRef &sym) {
error_or<int64_t> symbol_relative_address(const coff_obj &obj, const SymbolRef &sym) {
return symbol_address(obj, sym);
}

4 changes: 2 additions & 2 deletions lib/bap_llvm/llvm_elf_loader.hpp
Original file line number Diff line number Diff line change
@@ -161,10 +161,10 @@ error_or<uint64_t> symbol_file_offset(const ELFObjectFile<T> &obj, const SymbolR
}

template <typename T>
error_or<uint64_t> symbol_address(const ELFObjectFile<T> &obj, const SymbolRef &sym) {
error_or<int64_t> symbol_address(const ELFObjectFile<T> &obj, const SymbolRef &sym) {
auto sym_elf = obj.getSymbol(sym.getRawDataRefImpl());
if (is_rel(obj) && !is_abs_symbol(*sym_elf)) { // abs symbols does not affected by relocations
return success(uint64_t(0));
return success(int64_t(0));
} else {
auto addr = prim::symbol_address(sym);
if (!addr) return addr;
6 changes: 3 additions & 3 deletions lib/bap_llvm/llvm_macho_loader.hpp
Original file line number Diff line number Diff line change
@@ -156,7 +156,7 @@ uint32_t section_type(const macho &obj, SectionRef sec) {
return section_flags(obj, sec) & MachO::SECTION_TYPE;
}

void section(const std::string &name, uint64_t rel_addr, uint64_t size, uint64_t off, ogre_doc &s) {
void section(const std::string &name, int64_t rel_addr, uint64_t size, uint64_t off, ogre_doc &s) {
s.entry("section-entry") << name << rel_addr << size << off;
}

@@ -242,9 +242,9 @@ bool is_in_section(const macho &obj, const SymbolRef &sym) {
return ((typ & MachO::N_TYPE) == MachO::N_SECT);
}

error_or<uint64_t> symbol_address(const macho &obj, const SymbolRef &sym) {
error_or<int64_t> symbol_address(const macho &obj, const SymbolRef &sym) {
if (is_relocatable(obj))
return success(uint64_t(0));
return success(int64_t(0));
auto addr = prim::symbol_address(sym);
if (!addr) return addr;
auto base = image_base(obj);
5 changes: 2 additions & 3 deletions lib/bap_llvm/llvm_primitives.cpp
Original file line number Diff line number Diff line change
@@ -12,9 +12,8 @@ std::string arch_of_object(const llvm::object::ObjectFile &obj) {
return Triple::getArchTypeName(static_cast<Triple::ArchType>(obj.getArch()));
}

uint64_t relative_address(uint64_t base, uint64_t abs) {
if (abs >= base) return (abs - base);
else return abs;
int64_t relative_address(uint64_t base, uint64_t abs) {
return (abs - base);
}

// >= 4.0
4 changes: 2 additions & 2 deletions lib/bap_llvm/llvm_primitives.hpp
Original file line number Diff line number Diff line change
@@ -43,8 +43,8 @@ error_or<uint64_t> symbol_size(const SymbolRef &s);
uint64_t relocation_offset(const RelocationRef &rel);

// misc
// returns abs - base if abs >= base or just abs otherwise
uint64_t relative_address(uint64_t base, uint64_t abs);
// returns abs - base
int64_t relative_address(uint64_t base, uint64_t abs);

typedef std::vector<std::pair<SymbolRef, uint64_t>> symbols_sizes;

16 changes: 7 additions & 9 deletions plugins/print/print_main.ml
Original file line number Diff line number Diff line change
@@ -29,14 +29,14 @@ let should_print = function


let find_section_for_addr memory addr =
Memmap.lookup memory addr |> Seq.find_map ~f:(fun (mem,v) ->
Memmap.lookup memory addr |> Seq.find_map ~f:(fun (_,v) ->
Value.get Image.section v)

let bir memory sub =
Term.get_attr sub address >>=
find_section_for_addr memory

let sym memory (name,entry,cfg) =
let sym memory (_,entry,_) =
Block.addr entry |>
find_section_for_addr memory

@@ -49,10 +49,10 @@ let print_symbols subs secs demangler fmts ppf proj =
let demangle = create_demangler demangler in
let symtab = Project.symbols proj in
Symtab.to_sequence symtab |>
Seq.filter ~f:(fun ((name,entry,cfg) as fn) ->
Seq.filter ~f:(fun ((name,_,_) as fn) ->
should_print subs name &&
should_print secs (sec_name (Project.memory proj) sym fn)) |>
Seq.iter ~f:(fun ((name,entry,cfg) as fn) ->
Seq.iter ~f:(fun ((name,entry,_) as fn) ->
List.iter fmts ~f:(function
| `with_name ->
fprintf ppf "%s " @@ demangle name
@@ -226,10 +226,8 @@ let print_bir_graph subs secs ppf proj =
Term.enum sub_t prog |> Seq.iter ~f:(fun sub ->
fprintf ppf "%a@." Graphs.Ir.pp (Sub.to_cfg sub))

let pp_addr ppf addr =
let width = Addr.bitwidth addr / 4 in
fprintf ppf "%0*Lx" width
(Word.(to_int64 addr) |> ok_exn)
let pp_addr ppf a =
Addr.pp_generic ~prefix:`none ~case:`lower ppf a

let setup_tabs ppf =
pp_print_as ppf 50 "";
@@ -243,7 +241,7 @@ let print_disasm pp_insn subs secs ppf proj =
Memmap.filter_map memory ~f:(Value.get Image.section) |>
Memmap.to_sequence |> Seq.iter ~f:(fun (mem,sec) ->
Symtab.intersecting syms mem |>
List.filter ~f:(fun (name,entry,cfg) ->
List.filter ~f:(fun (name,_,_) ->
should_print subs name) |> function
| [] -> ()
| _ when not(should_print secs sec) -> ()

0 comments on commit 5880630

Please sign in to comment.