xref: /haiku/src/kits/debugger/debug_info/DwarfTeamDebugInfo.cpp (revision 7eab6b486ebadb54ca3c306601f4b04dd92359fa)
1 /*
2  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 2014-2016, Rene Gollent, rene@gollent.com.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 #include "DwarfTeamDebugInfo.h"
8 
9 #include <new>
10 
11 #include <string.h>
12 
13 #include "arch/Architecture.h"
14 #include "DebuggerInterface.h"
15 #include "DwarfFile.h"
16 #include "DwarfImageDebugInfo.h"
17 #include "DwarfImageDebugInfoLoadingState.h"
18 #include "DwarfManager.h"
19 #include "GlobalTypeLookup.h"
20 #include "ImageDebugInfoLoadingState.h"
21 #include "LocatableFile.h"
22 
23 
24 DwarfTeamDebugInfo::DwarfTeamDebugInfo(Architecture* architecture,
25 	DebuggerInterface* interface, FileManager* fileManager,
26 	GlobalTypeLookup* typeLookup, TeamFunctionSourceInformation* sourceInfo,
27 	GlobalTypeCache* typeCache)
28 	:
29 	fArchitecture(architecture),
30 	fDebuggerInterface(interface),
31 	fFileManager(fileManager),
32 	fManager(NULL),
33 	fTypeLookup(typeLookup),
34 	fSourceInfo(sourceInfo),
35 	fTypeCache(typeCache)
36 {
37 	fDebuggerInterface->AcquireReference();
38 	fTypeCache->AcquireReference();
39 }
40 
41 
42 DwarfTeamDebugInfo::~DwarfTeamDebugInfo()
43 {
44 	fDebuggerInterface->ReleaseReference();
45 	fTypeCache->ReleaseReference();
46 	delete fManager;
47 }
48 
49 
50 status_t
51 DwarfTeamDebugInfo::Init()
52 {
53 	fManager = new(std::nothrow) DwarfManager(fArchitecture->AddressSize(), fArchitecture->IsBigEndian());
54 	if (fManager == NULL)
55 		return B_NO_MEMORY;
56 
57 	status_t error = fManager->Init();
58 	if (error != B_OK)
59 		return error;
60 
61 	return B_OK;
62 }
63 
64 
65 status_t
66 DwarfTeamDebugInfo::CreateImageDebugInfo(const ImageInfo& imageInfo,
67 	LocatableFile* imageFile, ImageDebugInfoLoadingState& _state,
68 	SpecificImageDebugInfo*& _imageDebugInfo)
69 {
70 	// We only like images whose file we can play with.
71 	BString filePath;
72 	if (imageFile == NULL || !imageFile->GetLocatedPath(filePath))
73 		return B_ENTRY_NOT_FOUND;
74 
75 	// try to load the DWARF file
76 	DwarfImageDebugInfoLoadingState* dwarfState;
77 	if (_state.HasSpecificDebugInfoLoadingState()) {
78 		dwarfState = dynamic_cast<DwarfImageDebugInfoLoadingState*>(
79 			_state.GetSpecificDebugInfoLoadingState());
80 		if (dwarfState == NULL)
81 			return B_BAD_VALUE;
82 	} else {
83 	 	dwarfState = new(std::nothrow) DwarfImageDebugInfoLoadingState();
84 		if (dwarfState == NULL)
85 			return B_NO_MEMORY;
86 		_state.SetSpecificDebugInfoLoadingState(dwarfState);
87 	}
88 
89 	status_t error = fManager->LoadFile(filePath, dwarfState->GetFileState());
90 	if (error != B_OK)
91 		return error;
92 
93 	error = fManager->FinishLoading();
94 	if (error != B_OK)
95 		return error;
96 
97 	// create the image debug info
98 	DwarfImageDebugInfo* debugInfo = new(std::nothrow) DwarfImageDebugInfo(
99 		imageInfo, fDebuggerInterface, fArchitecture, fFileManager,
100 		fTypeLookup, fTypeCache, fSourceInfo, dwarfState->GetFileState().dwarfFile);
101 	if (debugInfo == NULL)
102 		return B_NO_MEMORY;
103 
104 	error = debugInfo->Init();
105 	if (error != B_OK) {
106 		delete debugInfo;
107 		return error;
108 	}
109 
110 	_imageDebugInfo = debugInfo;
111 	return B_OK;
112 }
113