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*d415bd75Srobertstatic bool shouldReduceDSOLocal(GlobalValue &GV) { 2073471bf0Spatrick return GV.isDSOLocal() && !GV.isImplicitDSOLocal(); 2173471bf0Spatrick } 2273471bf0Spatrick shouldReduceVisibility(GlobalValue & GV)23*d415bd75Srobertstatic bool shouldReduceVisibility(GlobalValue &GV) { 24*d415bd75Srobert return GV.getVisibility() != GlobalValue::VisibilityTypes::DefaultVisibility; 25*d415bd75Srobert } 2673471bf0Spatrick shouldReduceUnnamedAddress(GlobalValue & GV)27*d415bd75Srobertstatic bool shouldReduceUnnamedAddress(GlobalValue &GV) { 28*d415bd75Srobert return GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None; 29*d415bd75Srobert } 30*d415bd75Srobert shouldReduceDLLStorageClass(GlobalValue & GV)31*d415bd75Srobertstatic bool shouldReduceDLLStorageClass(GlobalValue &GV) { 32*d415bd75Srobert return GV.getDLLStorageClass() != 33*d415bd75Srobert GlobalValue::DLLStorageClassTypes::DefaultStorageClass; 34*d415bd75Srobert } 35*d415bd75Srobert shouldReduceThreadLocal(GlobalValue & GV)36*d415bd75Srobertstatic bool shouldReduceThreadLocal(GlobalValue &GV) { 37*d415bd75Srobert return GV.isThreadLocal(); 38*d415bd75Srobert } 39*d415bd75Srobert reduceGVs(Oracle & O,ReducerWorkItem & Program)40*d415bd75Srobertstatic 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)6073471bf0Spatrickvoid llvm::reduceGlobalValuesDeltaPass(TestRunner &Test) { 61*d415bd75Srobert runDeltaPass(Test, reduceGVs, "Reducing GlobalValues"); 6273471bf0Spatrick } 63