xref: /openbsd-src/gnu/llvm/llvm/tools/llvm-reduce/deltas/ReduceGlobalValues.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
173471bf0Spatrick //===- ReduceGlobalValues.cpp - Specialized Delta Pass --------------------===//
273471bf0Spatrick //
373471bf0Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473471bf0Spatrick // See https://llvm.org/LICENSE.txt for license information.
573471bf0Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673471bf0Spatrick //
773471bf0Spatrick //===----------------------------------------------------------------------===//
873471bf0Spatrick //
973471bf0Spatrick // This file implements a function which calls the Generic Delta pass to reduce
1073471bf0Spatrick // global value attributes/specifiers.
1173471bf0Spatrick //
1273471bf0Spatrick //===----------------------------------------------------------------------===//
1373471bf0Spatrick 
1473471bf0Spatrick #include "ReduceGlobalValues.h"
1573471bf0Spatrick #include "llvm/IR/GlobalValue.h"
1673471bf0Spatrick 
1773471bf0Spatrick using namespace llvm;
1873471bf0Spatrick 
shouldReduceDSOLocal(GlobalValue & GV)19*d415bd75Srobert static bool shouldReduceDSOLocal(GlobalValue &GV) {
2073471bf0Spatrick   return GV.isDSOLocal() && !GV.isImplicitDSOLocal();
2173471bf0Spatrick }
2273471bf0Spatrick 
shouldReduceVisibility(GlobalValue & GV)23*d415bd75Srobert static bool shouldReduceVisibility(GlobalValue &GV) {
24*d415bd75Srobert   return GV.getVisibility() != GlobalValue::VisibilityTypes::DefaultVisibility;
25*d415bd75Srobert }
2673471bf0Spatrick 
shouldReduceUnnamedAddress(GlobalValue & GV)27*d415bd75Srobert static bool shouldReduceUnnamedAddress(GlobalValue &GV) {
28*d415bd75Srobert   return GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None;
29*d415bd75Srobert }
30*d415bd75Srobert 
shouldReduceDLLStorageClass(GlobalValue & GV)31*d415bd75Srobert static bool shouldReduceDLLStorageClass(GlobalValue &GV) {
32*d415bd75Srobert   return GV.getDLLStorageClass() !=
33*d415bd75Srobert          GlobalValue::DLLStorageClassTypes::DefaultStorageClass;
34*d415bd75Srobert }
35*d415bd75Srobert 
shouldReduceThreadLocal(GlobalValue & GV)36*d415bd75Srobert static bool shouldReduceThreadLocal(GlobalValue &GV) {
37*d415bd75Srobert   return GV.isThreadLocal();
38*d415bd75Srobert }
39*d415bd75Srobert 
reduceGVs(Oracle & O,ReducerWorkItem & Program)40*d415bd75Srobert static void reduceGVs(Oracle &O, ReducerWorkItem &Program) {
41*d415bd75Srobert   for (auto &GV : Program.getModule().global_values()) {
42*d415bd75Srobert     if (shouldReduceDSOLocal(GV) && !O.shouldKeep())
43*d415bd75Srobert       GV.setDSOLocal(false);
44*d415bd75Srobert     if (shouldReduceVisibility(GV) && !O.shouldKeep()) {
45*d415bd75Srobert       bool IsImplicitDSOLocal = GV.isImplicitDSOLocal();
46*d415bd75Srobert       GV.setVisibility(GlobalValue::VisibilityTypes::DefaultVisibility);
47*d415bd75Srobert       if (IsImplicitDSOLocal)
4873471bf0Spatrick         GV.setDSOLocal(false);
4973471bf0Spatrick     }
50*d415bd75Srobert     if (shouldReduceUnnamedAddress(GV) && !O.shouldKeep())
51*d415bd75Srobert       GV.setUnnamedAddr(GlobalValue::UnnamedAddr::None);
52*d415bd75Srobert     if (shouldReduceDLLStorageClass(GV) && !O.shouldKeep())
53*d415bd75Srobert       GV.setDLLStorageClass(
54*d415bd75Srobert           GlobalValue::DLLStorageClassTypes::DefaultStorageClass);
55*d415bd75Srobert     if (shouldReduceThreadLocal(GV) && !O.shouldKeep())
56*d415bd75Srobert       GV.setThreadLocal(false);
5773471bf0Spatrick   }
5873471bf0Spatrick }
5973471bf0Spatrick 
reduceGlobalValuesDeltaPass(TestRunner & Test)6073471bf0Spatrick void llvm::reduceGlobalValuesDeltaPass(TestRunner &Test) {
61*d415bd75Srobert   runDeltaPass(Test, reduceGVs, "Reducing GlobalValues");
6273471bf0Spatrick }
63