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