• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *	http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "a.h"
16 #include <cstdio>
17 
18 namespace liba {
19 
20 static int next_object_id = 0;
21 
ClassA(unsigned value)22 ClassA::ClassA(unsigned value):
23     object_id(next_object_id++),
24     value(value) {
25         Log("ctor");
26 }
27 
~ClassA()28 ClassA::~ClassA() {
29     Log("dtor");
30 }
31 
Instance()32 ClassA& ClassA::Instance() {
33     static ClassA instance(0);
34     return instance;
35 }
36 
Log(const char * message) const37 void ClassA::Log(const char* message) const {
38     printf("[ClassA::Log] \t[%s] \toid:%d \tvalue:%d\n", message, object_id, value);
39 
40 }
41 
Value() const42 unsigned ClassA::Value() const {
43     return value;
44 }
45 
SetFlag(unsigned bit)46 void ClassA::SetFlag(unsigned bit) {
47     Log("pre-SetFlag");
48     value |= 1<<bit;
49     Log("post-SetFlag");
50 }
51 
HasFlag(unsigned bit) const52 bool ClassA::HasFlag(unsigned bit) const {
53     return !!(value & (1<<bit));
54 }
55 
init_a_0()56 void __attribute__((constructor)) init_a_0() {
57     printf("called liba::init_a_0\n");
58     ClassA::Instance().SetFlag(INIT_0);
59 }
60 
init_a_1()61 void __attribute__((constructor)) init_a_1() {
62     printf("called liba::init_a_1\n");
63     ClassA::Instance().SetFlag(INIT_1);
64 }
65 
fini_a_0()66 void __attribute__((destructor)) fini_a_0() {
67     printf("called liba::fini_a_0\n");
68     ClassA::Instance().SetFlag(FINI_0);
69 }
70 
fini_a_1()71 void __attribute__((destructor)) fini_a_1() {
72     printf("called liba::fini_a_1\n");
73     ClassA::Instance().SetFlag(FINI_1);
74 }
75 
fini_a_2()76 void __attribute__((destructor)) fini_a_2() {
77     printf("called liba::fini_a_2\n");
78     ClassA::Instance().SetFlag(FINI_2);
79 }
80 
81 const ClassA
82         class_a_instance_0(42+0),
83         class_a_instance_1(42+1)
84         ;
85 
86 } // namespace liba