blob: 12597156060d4beb1d2ebf4ce0911e3537dfc6c8 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file is compiled into a library and used in zxdb tests to query
// symbol information. The actual code is not run.
#include "garnet/bin/zxdb/symbols/test_data/zxdb_symbol_test.h"
// DW_TAG_namespace
// DW_AT_name = "my_ns"
namespace my_ns {
// DW_TAG_variable
// DW_AT_name = "kGlobal
// DW_AT_type = <ref to DIE declaring "int">
// DW_AT_external = true
// DW_AT_decl_file = ...
// DW_AT_decl_line = ...
// DW_AT_location = ...
// DW_AT_linkage_name = "_ZN5my_ns7kGlobalE"
//
// (Unlike MyClass::kClassStatic, this variable shared the declaration and
// storage.)
int kGlobal = 19;
// DW_TAG_class_type
// DW_AT_name = "MyClass"
class MyClass {
public:
// DW_TAG_structure_type
// DW_AT_name = "Inner"
struct Inner {
// DW_TAG_subprogram
// DW_AT_name = "MyMemberTwo"
// DW_AT_linkage_name = "_ZN5my_ns7MyClass11MyMemberOneEv"
// DW_AT_declaration = true (indicates implementation is elsewhere).
// DW_AT_type = <ref to DIE declaring "int">
NOINLINE static int MyMemberTwo();
};
// DW_TAG_member
// DW_AT_name = "kClassStatic"
// DW_AT_type = <ref to DIE declaring "int">
// DW_AT_decl_file = ...
// DW_AT_decl_line = ...
// DW_AT_external = true
// DW_AT_declaration = true
static int kClassStatic;
// DW_TAG_subprogram
// DW_AT_name = "MyMemberOne"
// DW_AT_linkage_name = "_ZN5my_ns7MyClass11MyMemberOneEv"
// DW_AT_declaration = true (indicates implementation is elsewhere).
// DW_AT_type = <ref to DIE declaring "int">
//
// DW_TAG_formal_parameter
// DW_AT_artificial = true ("this" is the implicit parameter).
// DW_AT_type = <reference to "MyClass*" type>
NOINLINE int MyMemberOne() { return 42; }
};
// DW_TAG_variable
// DW_AT_specification = <ref to DIE declaring this class member>.
// DW_AT_location = ...
// DW_AT_linkage_name "_ZN5my_ns7MyClass12kClassStaticE"
//
// (Unlike kGlobal, this static has a separate declaration and storage.)
int MyClass::kClassStatic = 12;
// The DW_TAG_namespace will end here even though the namespace encloses the
// following function definition. The namespace is only used for the
// definitions, while the actual implementations have no namespacing or class
// information (you have to follow DW_AT_specification to find the declaration
// to get this stuff).
// DW_TAG_subprogram
// DW_AT_low_pc = ... (these indicate there's actually code)
// DW_AT_high_pc = ...
// DW_AT_specification = <ref to the DIE for the definition>
NOINLINE int MyClass::Inner::MyMemberTwo() { return 61; }
// A function inside the namespace. This function has no separate definition.
EXPORT int NamespaceFunction() { return 78; }
} // namespace my_ns
// DW_TAG_subprogram
// DW_AT_low_pc = ... (indicates there's code).
// DW_AT_high_pc = ...
// DW_AT_linkage_name = "_Z10MyFunctionv"
// DW_AT_type = <ref to DIE declaring "int">
//
// (This one has no declaration nor specification attributes because there
// wasn't a separate declaration.)
int MyFunction() { // Must be on line # ModulSymbols::kMyFunctionLine.
// DW_TAG_variable
// DW_AT_name = "my_class"
// DW_AT_type = <reference to MyClass DIE above>
my_ns::MyClass my_class;
return my_class.MyMemberOne() + my_ns::NamespaceFunction() +
my_ns::MyClass::Inner::MyMemberTwo();
}
// The inplementation of the MyClass::MyMemberOne will be inserted somewhere in
// the unit and it will reference the declaration.
//
// DW_TAG_subprogram
// DW_AT_low_pc = ... (indicates there's code).
// DW_AT_high_pc = ...
// DW_AT_specification = <ref to the DIE for "MyClass::MyMemberOne">
// Somewhere in the unit these types will be defined which are referenced as
// types from the various functions. There could also be dupes!
//
// DW_TAG_base_type
// DW_AT_name = "int"
// DW_AT_encoding = DW_ATE_signed
// DW_AT_byte_size = 4
//
// DW_TAG_pointer_type ("MyClass*" which is used as the "this" param type.)
// DW_AT_type = <reference to "MyClass" DIE above>