//===- ReduceGlobalValues.cpp - Specialized Delta Pass --------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This file implements a function which calls the Generic Delta pass to reduce
// global value attributes/specifiers.
//
//===----------------------------------------------------------------------===//

#include "ReduceGlobalValues.h"
#include "llvm/IR/GlobalValue.h"

using namespace llvm;

static bool shouldReduceDSOLocal(GlobalValue &GV) {
  return GV.isDSOLocal() && !GV.isImplicitDSOLocal();
}

static bool shouldReduceVisibility(GlobalValue &GV) {
  return GV.getVisibility() != GlobalValue::VisibilityTypes::DefaultVisibility;
}

static bool shouldReduceUnnamedAddress(GlobalValue &GV) {
  return GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None;
}

static bool shouldReduceDLLStorageClass(GlobalValue &GV) {
  return GV.getDLLStorageClass() !=
         GlobalValue::DLLStorageClassTypes::DefaultStorageClass;
}

static bool shouldReduceThreadLocal(GlobalValue &GV) {
  return GV.isThreadLocal();
}

static void reduceGVs(Oracle &O, Module &Program) {
  for (auto &GV : Program.global_values()) {
    if (shouldReduceDSOLocal(GV) && !O.shouldKeep())
      GV.setDSOLocal(false);
    if (shouldReduceVisibility(GV) && !O.shouldKeep()) {
      bool IsImplicitDSOLocal = GV.isImplicitDSOLocal();
      GV.setVisibility(GlobalValue::VisibilityTypes::DefaultVisibility);
      if (IsImplicitDSOLocal)
        GV.setDSOLocal(false);
    }
    if (shouldReduceUnnamedAddress(GV) && !O.shouldKeep())
      GV.setUnnamedAddr(GlobalValue::UnnamedAddr::None);
    if (shouldReduceDLLStorageClass(GV) && !O.shouldKeep())
      GV.setDLLStorageClass(
          GlobalValue::DLLStorageClassTypes::DefaultStorageClass);
    if (shouldReduceThreadLocal(GV) && !O.shouldKeep())
      GV.setThreadLocal(false);
  }
}

void llvm::reduceGlobalValuesDeltaPass(TestRunner &Test) {
  outs() << "*** Reducing GlobalValues...\n";
  runDeltaPass(Test, reduceGVs);
}
