vdl-context.h
author Hajime Tazaki <tazaki@sfc.wide.ad.jp>
Mon, 01 Jun 2015 14:21:35 +0900
changeset 664 213835f32c54
parent 571 2e0bc0692dfd
permissions -rw-r--r--
Bug 2101 - When loading binary not compiled with the correct options, dce crashes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
533
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
#ifndef VDL_CONTEXT_H
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
#define VDL_CONTEXT_H
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
#include <stdint.h>
538
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
     5
#include <stdbool.h>
533
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
struct VdlList;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
struct VdlFile;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
struct VdlContextSymbolRemapEntry
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
{
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
  char *src_name;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
  char *src_ver_name;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
  char *src_ver_filename;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
  char *dst_name;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
  char *dst_ver_name;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
  char *dst_ver_filename;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
};
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
struct VdlContextLibRemapEntry
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
{
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
  char *src;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
  char *dst;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
};
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
enum VdlEvent {
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
  VDL_EVENT_MAPPED,
571
2e0bc0692dfd gah, forgot to update enum
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 538
diff changeset
    27
  VDL_EVENT_UNMAPPED,
533
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
  VDL_EVENT_CONSTRUCTED,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
  VDL_EVENT_DESTROYED
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
};
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
struct VdlContextEventCallbackEntry
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
{
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
  void (*fn) (void *handle, enum VdlEvent event, void *context);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
  void *context;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
};
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
struct VdlContext
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
{
538
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    39
  // the list of files loaded in this context
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    40
  struct VdlList *loaded;
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    41
  // the list of files which are part of the global scope of this context
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    42
  // this set is necessarily a subset of the set of loaded files
533
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
  struct VdlList *global_scope;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
  // describe which symbols should be remapped to which 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
  // other symbols during symbol resolution
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
  struct VdlList *symbol_remaps;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
  // describe which libraries should be remapped to which 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
  // other libraries during loading
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
  struct VdlList *lib_remaps;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
  // report events within this context
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
  struct VdlList *event_callbacks;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
  // These variables are used by all .init functions
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
  // _some_ libc .init functions make use of these
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
  // 3 arguments so, even though no one else uses them, 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
  // we have to pass them around.
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
  int argc;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
  char **argv;
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  char **envp;  
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
};
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
struct VdlContext *vdl_context_new (int argc, char **argv, char **envp);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
void vdl_context_delete (struct VdlContext *context);
538
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    63
void vdl_context_add_file (struct VdlContext *context,
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    64
			   struct VdlFile *file);
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    65
void vdl_context_remove_file (struct VdlContext *context,
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    66
			      struct VdlFile *file);
533
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
void vdl_context_add_lib_remap (struct VdlContext *context, const char *src, const char *dst);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
void vdl_context_add_symbol_remap (struct VdlContext *context, 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
				   const char *src_name, 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
				   const char *src_ver_name, 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
				   const char *src_ver_filename, 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
				   const char *dst_name,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
				   const char *dst_ver_name,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
				   const char *dst_ver_filename);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
void vdl_context_add_callback (struct VdlContext *context,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
			       void (*cb) (void *handle, enum VdlEvent event, void *context),
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
			       void *cb_context);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
void vdl_context_notify (struct VdlContext *context,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
			 struct VdlFile *file,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
			 enum VdlEvent event);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
const char *vdl_context_lib_remap (const struct VdlContext *context, const char *name);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
void vdl_context_symbol_remap (const struct VdlContext *context, 
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
			       const char **name,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
			       const char **ver_name,
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
			       const char **ver_filename);
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
538
35d137b26ca1 cleanup vdl.h API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 533
diff changeset
    87
bool vdl_context_empty (const struct VdlContext *context);
533
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
7dd9ac1c0619 split file
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
#endif /* VDL_CONTEXT_H */