78 lines · cpp
1//===- ReduceGlobalValues.cpp - Specialized Delta Pass --------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements a function which calls the Generic Delta pass to reduce10// global value attributes/specifiers.11//12//===----------------------------------------------------------------------===//13 14#include "ReduceGlobalValues.h"15#include "llvm/IR/GlobalValue.h"16 17using namespace llvm;18 19static bool shouldReduceDSOLocal(GlobalValue &GV) {20 return GV.isDSOLocal() && !GV.isImplicitDSOLocal();21}22 23static bool shouldReduceVisibility(GlobalValue &GV) {24 return GV.getVisibility() != GlobalValue::VisibilityTypes::DefaultVisibility;25}26 27static bool shouldReduceUnnamedAddress(GlobalValue &GV) {28 return GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None;29}30 31static bool shouldReduceDLLStorageClass(GlobalValue &GV) {32 return GV.getDLLStorageClass() !=33 GlobalValue::DLLStorageClassTypes::DefaultStorageClass;34}35 36static bool shouldReduceThreadLocal(GlobalValue &GV) {37 return GV.isThreadLocal();38}39 40static bool shouldReduceLinkage(GlobalValue &GV) {41 return !GV.hasExternalLinkage() && !GV.hasAppendingLinkage();42}43 44void llvm::reduceGlobalValuesDeltaPass(Oracle &O, ReducerWorkItem &Program) {45 for (auto &GV : Program.getModule().global_values()) {46 if (shouldReduceDSOLocal(GV) && !O.shouldKeep())47 GV.setDSOLocal(false);48 if (shouldReduceVisibility(GV) && !O.shouldKeep()) {49 bool IsImplicitDSOLocal = GV.isImplicitDSOLocal();50 GV.setVisibility(GlobalValue::VisibilityTypes::DefaultVisibility);51 if (IsImplicitDSOLocal)52 GV.setDSOLocal(false);53 }54 if (shouldReduceUnnamedAddress(GV) && !O.shouldKeep())55 GV.setUnnamedAddr(GlobalValue::UnnamedAddr::None);56 if (shouldReduceDLLStorageClass(GV) && !O.shouldKeep())57 GV.setDLLStorageClass(58 GlobalValue::DLLStorageClassTypes::DefaultStorageClass);59 if (shouldReduceThreadLocal(GV) && !O.shouldKeep())60 GV.setThreadLocal(false);61 if (shouldReduceLinkage(GV) && !O.shouldKeep()) {62 bool IsImplicitDSOLocal = GV.isImplicitDSOLocal();63 GV.setLinkage(GlobalValue::ExternalLinkage);64 if (IsImplicitDSOLocal)65 GV.setDSOLocal(false);66 }67 68 // TODO: Should this go in a separate reduction?69 if (auto *GVar = dyn_cast<GlobalVariable>(&GV)) {70 if (GVar->isExternallyInitialized() && !O.shouldKeep())71 GVar->setExternallyInitialized(false);72 73 if (GVar->getCodeModel() && !O.shouldKeep())74 GVar->clearCodeModel();75 }76 }77}78