2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: lib/rossym/find.c
5 * PURPOSE: Find symbol info for an address
7 * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com)
10 * Parts of this file based on work Copyright (c) 1990, 1993
11 * The Regents of the University of California. All rights reserved.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 4. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 #include <reactos/rossym.h>
40 #include "rossympriv.h"
50 RosSymGetAddressInformation
51 (PROSSYM_INFO RosSymInfo
,
52 ULONG_PTR RelativeAddress
,
53 PROSSYM_LINEINFO RosSymLineInfo
)
55 ROSSYM_REGISTERS registers
;
56 DwarfParam params
[sizeof(RosSymLineInfo
->Parameters
)/sizeof(RosSymLineInfo
->Parameters
[0])];
59 int res
= dwarfpctoline
62 RelativeAddress
+ RosSymInfo
->pe
->imagebase
,
63 &RosSymLineInfo
->FileName
,
64 &RosSymLineInfo
->FunctionName
,
65 &RosSymLineInfo
->LineNumber
);
67 werrstr("Could not get basic function info");
71 if (!(RosSymLineInfo
->Flags
& ROSSYM_LINEINFO_HAS_REGISTERS
))
74 registers
= RosSymLineInfo
->Registers
;
80 RelativeAddress
+ RosSymInfo
->pe
->imagebase
,
81 proc
.attrs
.framebase
.c
,
84 werrstr("Can't get cfa location for %s", RosSymLineInfo
->FunctionName
);
91 RelativeAddress
+ RosSymInfo
->pe
->imagebase
,
92 sizeof(params
)/sizeof(params
[0]),
96 werrstr("%s: could not get params at all", RosSymLineInfo
->FunctionName
);
97 RosSymLineInfo
->NumParams
= 0;
101 werrstr("%s: res %d", RosSymLineInfo
->FunctionName
, res
);
102 RosSymLineInfo
->NumParams
= res
;
104 res
= dwarfcomputecfa(RosSymInfo
, &cfa
, ®isters
, &cfaLocation
);
106 werrstr("%s: could not get our own cfa", RosSymLineInfo
->FunctionName
);
110 for (i
= 0; i
< RosSymLineInfo
->NumParams
; i
++) {
111 werrstr("Getting arg %s, unit %x, type %x",
112 params
[i
].name
, params
[i
].unit
, params
[i
].type
);
116 RelativeAddress
+ RosSymInfo
->pe
->imagebase
,
120 if (res
== -1) { RosSymLineInfo
->NumParams
= i
; return TRUE
; }
121 werrstr("%s: %x", params
[i
].name
, params
[i
].value
);
122 RosSymLineInfo
->Parameters
[i
].ValueName
= malloc(strlen(params
[i
].name
)+1);
123 strcpy(RosSymLineInfo
->Parameters
[i
].ValueName
, params
[i
].name
);
124 free(params
[i
].name
);
125 RosSymLineInfo
->Parameters
[i
].Value
= params
[i
].value
;