blob: 2589c89f280167e7bf31c3e831503d6be1db1045 [file] [log] [blame]
Christopher Ferris61d40972017-06-12 19:14:20 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _LIBUNWINDSTACK_DWARF_EH_FRAME_H
18#define _LIBUNWINDSTACK_DWARF_EH_FRAME_H
19
20#include <stdint.h>
21
Christopher Ferrisd226a512017-07-14 10:37:19 -070022#include <unwindstack/DwarfSection.h>
Christopher Ferrisc9dee842017-11-03 14:50:27 -070023#include <unwindstack/Memory.h>
Christopher Ferrisd226a512017-07-14 10:37:19 -070024
25namespace unwindstack {
Christopher Ferris61d40972017-06-12 19:14:20 -070026
Christopher Ferris61d40972017-06-12 19:14:20 -070027template <typename AddressType>
28class DwarfEhFrame : public DwarfSectionImpl<AddressType> {
29 public:
Christopher Ferris61d40972017-06-12 19:14:20 -070030 DwarfEhFrame(Memory* memory) : DwarfSectionImpl<AddressType>(memory) {}
31 virtual ~DwarfEhFrame() = default;
32
Christopher Ferris61d40972017-06-12 19:14:20 -070033 uint64_t GetCieOffsetFromFde32(uint32_t pointer) override {
Christopher Ferrisc9dee842017-11-03 14:50:27 -070034 return this->memory_.cur_offset() - pointer - 4;
Christopher Ferris61d40972017-06-12 19:14:20 -070035 }
36
37 uint64_t GetCieOffsetFromFde64(uint64_t pointer) override {
Christopher Ferrisc9dee842017-11-03 14:50:27 -070038 return this->memory_.cur_offset() - pointer - 8;
Christopher Ferris61d40972017-06-12 19:14:20 -070039 }
40
41 uint64_t AdjustPcFromFde(uint64_t pc) override {
42 // The eh_frame uses relative pcs.
Christopher Ferrisc3d79f72017-11-28 19:14:54 -080043 return pc + this->memory_.cur_offset() - 4;
Christopher Ferris61d40972017-06-12 19:14:20 -070044 }
Christopher Ferris61d40972017-06-12 19:14:20 -070045};
46
Christopher Ferrisd226a512017-07-14 10:37:19 -070047} // namespace unwindstack
48
Christopher Ferrisc9dee842017-11-03 14:50:27 -070049#endif // _LIBUNWINDSTACK_DWARF_EH_FRAME_WITH_HDR_H