Skip to content

Commit f1c51c8

Browse files
committed
Fix memory leaks in addCapability and addConditionalCapability
Compiling with -fsantize=address uncovered 2 memory leaks. Instead of handling memory manually, we could use std::unique_ptr to free the memory for us.
1 parent 6238ea3 commit f1c51c8

File tree

3 files changed

+15
-17
lines changed

3 files changed

+15
-17
lines changed

lib/SPIRV/libSPIRV/SPIRVFnVar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ bool specializeFnVariants(SPIRVModule *BM, std::string &ErrMsg) {
169169
for (const auto &CondCap : BM->getConditionalCapabilities()) {
170170
const SPIRVId Condition = CondCap.first.first;
171171
const Capability Cap = CondCap.first.second;
172-
const SPIRVConditionalCapabilityINTEL *Entry = CondCap.second;
172+
const SPIRVConditionalCapabilityINTEL *Entry = CondCap.second.get();
173173
bool ShouldKeep = false;
174174
if (!evaluateConstant(BM, Entry->getCondition(), ShouldKeep, ErrMsg)) {
175175
return false;

lib/SPIRV/libSPIRV/SPIRVModule.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -663,12 +663,6 @@ SPIRVModuleImpl::~SPIRVModuleImpl() {
663663
for (auto I : IdEntryMap)
664664
delete I.second;
665665

666-
for (auto C : CapMap)
667-
delete C.second;
668-
669-
for (auto C : ConditionalCapMap)
670-
delete C.second;
671-
672666
for (auto *M : ModuleProcessedVec)
673667
delete M;
674668
}
@@ -787,10 +781,12 @@ void SPIRVModuleImpl::addCapability(SPIRVCapabilityKind Cap) {
787781
addCapabilities(SPIRV::getCapability(Cap));
788782
SPIRVDBG(spvdbgs() << "addCapability: " << SPIRVCapabilityNameMap::map(Cap)
789783
<< '\n');
790-
if (hasCapability(Cap))
784+
785+
auto [It, Inserted] = CapMap.insert(std::make_pair(Cap, nullptr));
786+
if (!Inserted)
791787
return;
792788

793-
auto *CapObj = new SPIRVCapability(this, Cap);
789+
auto CapObj = std::make_unique<SPIRVCapability>(this, Cap);
794790
if (AutoAddExtensions) {
795791
// While we are reading existing SPIR-V we need to read it as-is and don't
796792
// add required extensions for each entry automatically
@@ -799,7 +795,7 @@ void SPIRVModuleImpl::addCapability(SPIRVCapabilityKind Cap) {
799795
addExtension(Ext.value());
800796
}
801797

802-
CapMap.insert(std::make_pair(Cap, CapObj));
798+
It->second = std::move(CapObj);
803799
}
804800

805801
void SPIRVModuleImpl::addCapabilityInternal(SPIRVCapabilityKind Cap) {
@@ -816,18 +812,19 @@ void SPIRVModuleImpl::addConditionalCapability(SPIRVId Condition,
816812
SPIRVDBG(spvdbgs() << "addConditionalCapability: "
817813
<< SPIRVCapabilityNameMap::map(Cap)
818814
<< ", condition: " << Condition << '\n');
819-
if (ConditionalCapMap.find(std::make_pair(Condition, Cap)) !=
820-
ConditionalCapMap.end()) {
815+
auto Key = std::make_pair(Condition, Cap);
816+
auto [It, Inserted] = ConditionalCapMap.insert({Key, nullptr});
817+
if (!Inserted) {
821818
return;
822819
}
823820

824-
auto *CapObj = new SPIRVConditionalCapabilityINTEL(this, Condition, Cap);
821+
auto CapObj =
822+
std::make_unique<SPIRVConditionalCapabilityINTEL>(this, Condition, Cap);
825823
if (AutoAddExtensions) {
826824
assert(false && "Auto adding conditional extensions is not supported.");
827825
}
828826

829-
ConditionalCapMap.insert(
830-
std::make_pair(std::make_pair(Condition, Cap), CapObj));
827+
It->second = std::move(CapObj);
831828
}
832829

833830
void SPIRVModuleImpl::eraseConditionalCapability(SPIRVId Condition,

lib/SPIRV/libSPIRV/SPIRVModule.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ struct SPIRVTypeImageDescriptor;
109109

110110
class SPIRVModule {
111111
public:
112-
typedef std::map<SPIRVCapabilityKind, SPIRVCapability *> SPIRVCapMap;
112+
typedef std::map<SPIRVCapabilityKind, std::unique_ptr<SPIRVCapability>>
113+
SPIRVCapMap;
113114
typedef std::map<std::pair<SPIRVId, SPIRVCapabilityKind>,
114-
SPIRVConditionalCapabilityINTEL *>
115+
std::unique_ptr<SPIRVConditionalCapabilityINTEL>>
115116
SPIRVConditionalCapMap;
116117
typedef std::vector<SPIRVConditionalEntryPointINTEL *>
117118
SPIRVConditionalEntryPointVec;

0 commit comments

Comments
 (0)