Hash :
3e9a1375
Author :
Date :
2025-04-30T16:03:03
Fix unique object duplication warning Clang has a `unique-object-duplication` warning that warns about objects which are supposed to be unique (like static- or thread-local variables), but may be accidentally duplicated across shared libraries when they have hidden visibility. This CL addresses instances of that warning by: 1. Ensuring that on non-windows systems, objects that need to be exported are unconditionally given "default" visibility 2. Satisfy the compiler by marking everything as default visibility when building a static library, since visibility only matters for shared libraries 3. Mark functions with static or thread local variables as exported. Bug: chromium:368047728 Change-Id: Ic60265353bf2b0af2cd1fef884bfa85038e0db02 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6502093 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
//
// Copyright 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "common/angleutils.h"
#include "common/debug.h"
#include <stdio.h>
#include <limits>
#include <vector>
namespace angle
{
// dirtyPointer is a special value that will make the comparison with any valid pointer fail and
// force the renderer to re-apply the state.
const uintptr_t DirtyPointer = std::numeric_limits<uintptr_t>::max();
// AMD_performance_monitor helpers.
PerfMonitorCounter::PerfMonitorCounter() = default;
PerfMonitorCounter::~PerfMonitorCounter() = default;
PerfMonitorCounterGroup::PerfMonitorCounterGroup() = default;
PerfMonitorCounterGroup::~PerfMonitorCounterGroup() = default;
uint32_t GetPerfMonitorCounterIndex(const PerfMonitorCounters &counters, const std::string &name)
{
for (uint32_t counterIndex = 0; counterIndex < static_cast<uint32_t>(counters.size());
++counterIndex)
{
if (counters[counterIndex].name == name)
{
return counterIndex;
}
}
return std::numeric_limits<uint32_t>::max();
}
uint32_t GetPerfMonitorCounterGroupIndex(const PerfMonitorCounterGroups &groups,
const std::string &name)
{
for (uint32_t groupIndex = 0; groupIndex < static_cast<uint32_t>(groups.size()); ++groupIndex)
{
if (groups[groupIndex].name == name)
{
return groupIndex;
}
}
return std::numeric_limits<uint32_t>::max();
}
const PerfMonitorCounter &GetPerfMonitorCounter(const PerfMonitorCounters &counters,
const std::string &name)
{
return GetPerfMonitorCounter(const_cast<PerfMonitorCounters &>(counters), name);
}
PerfMonitorCounter &GetPerfMonitorCounter(PerfMonitorCounters &counters, const std::string &name)
{
uint32_t counterIndex = GetPerfMonitorCounterIndex(counters, name);
ASSERT(counterIndex < static_cast<uint32_t>(counters.size()));
return counters[counterIndex];
}
const PerfMonitorCounterGroup &GetPerfMonitorCounterGroup(const PerfMonitorCounterGroups &groups,
const std::string &name)
{
return GetPerfMonitorCounterGroup(const_cast<PerfMonitorCounterGroups &>(groups), name);
}
PerfMonitorCounterGroup &GetPerfMonitorCounterGroup(PerfMonitorCounterGroups &groups,
const std::string &name)
{
uint32_t groupIndex = GetPerfMonitorCounterGroupIndex(groups, name);
ASSERT(groupIndex < static_cast<uint32_t>(groups.size()));
return groups[groupIndex];
}
} // namespace angle
std::string ArrayString(unsigned int i)
{
// We assume that UINT_MAX and GL_INVALID_INDEX are equal.
ASSERT(i != UINT_MAX);
std::stringstream strstr;
strstr << "[";
strstr << i;
strstr << "]";
return strstr.str();
}
std::string ArrayIndexString(const std::vector<unsigned int> &indices)
{
std::stringstream strstr;
for (auto indicesIt = indices.rbegin(); indicesIt != indices.rend(); ++indicesIt)
{
// We assume that UINT_MAX and GL_INVALID_INDEX are equal.
ASSERT(*indicesIt != UINT_MAX);
strstr << "[";
strstr << (*indicesIt);
strstr << "]";
}
return strstr.str();
}
size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char> &outBuffer)
{
va_list varargCopy;
va_copy(varargCopy, vararg);
int len = vsnprintf(nullptr, 0, fmt, vararg);
ASSERT(len >= 0);
outBuffer.resize(len + 1, 0);
len = vsnprintf(outBuffer.data(), outBuffer.size(), fmt, varargCopy);
va_end(varargCopy);
ASSERT(len >= 0);
return static_cast<size_t>(len);
}
const char *MakeStaticString(const std::string &str)
{
// On the heap so that no destructor runs on application exit.
static std::set<std::string> *strings = new std::set<std::string>;
std::set<std::string>::iterator it = strings->find(str);
if (it != strings->end())
{
return it->c_str();
}
return strings->insert(str).first->c_str();
}