llvm-project/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp
Eli Friedman 9f82ac5738
Remove GlobalObject::getAlign/setAlignment (#143188)
Currently, GlobalObject has an "alignment" property... but it's
basically nonsense: alignment doesn't mean the same thing for variables
and functions, and it's completely meaningless for ifuncs.

This "removes" (actually marking protected) the methods from
GlobalObject, adds the relevant methods to Function and GlobalVariable,
and adjusts the code appropriately.

This should make future alignment-related cleanups easier.
2025-06-09 13:51:03 -07:00

40 lines
1.3 KiB
C++

//===- ReduceGlobalObjects.cpp --------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "ReduceGlobalObjects.h"
#include "llvm/IR/GlobalObject.h"
using namespace llvm;
static bool shouldReduceSection(GlobalObject &GO) { return GO.hasSection(); }
static bool shouldReduceAlign(GlobalVariable *GV) {
return GV->getAlign().has_value();
}
static bool shouldReduceAlign(Function *F) { return F->getAlign().has_value(); }
static bool shouldReduceComdat(GlobalObject &GO) { return GO.hasComdat(); }
void llvm::reduceGlobalObjectsDeltaPass(Oracle &O, ReducerWorkItem &Program) {
for (auto &GO : Program.getModule().global_objects()) {
if (shouldReduceSection(GO) && !O.shouldKeep())
GO.setSection("");
if (auto *GV = dyn_cast<GlobalVariable>(&GO)) {
if (shouldReduceAlign(GV) && !O.shouldKeep())
GV->setAlignment(MaybeAlign());
}
if (auto *F = dyn_cast<Function>(&GO)) {
if (shouldReduceAlign(F) && !O.shouldKeep())
F->setAlignment(MaybeAlign());
}
if (shouldReduceComdat(GO) && !O.shouldKeep())
GO.setComdat(nullptr);
}
}