// Copyright (c) 2017 The Khronos Group Inc.
// Copyright (c) 2017 Valve Corporation
// Copyright (c) 2017 LunarG Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef LIBSPIRV_OPT_INLINE_OPAQUE_PASS_H_
#define LIBSPIRV_OPT_INLINE_OPAQUE_PASS_H_

#include <algorithm>
#include <list>
#include <memory>
#include <unordered_map>
#include <vector>

#include "def_use_manager.h"
#include "inline_pass.h"
#include "module.h"

namespace spvtools {
namespace opt {

// See optimizer.hpp for documentation.
class InlineOpaquePass : public InlinePass {
 public:
  InlineOpaquePass();
  Status Process(opt::IRContext* c) override;

  const char* name() const override { return "inline-entry-points-opaque"; }

 private:
  // Return true if |typeId| is or contains opaque type
  bool IsOpaqueType(uint32_t typeId);

  // Return true if function call |callInst| has opaque argument or return type
  bool HasOpaqueArgsOrReturn(const opt::Instruction* callInst);

  // Inline all function calls in |func| that have opaque params or return
  // type. Inline similarly all code that is inlined into func. Return true
  // if func is modified.
  bool InlineOpaque(opt::Function* func);

  void Initialize(opt::IRContext* c);
  Pass::Status ProcessImpl();
};

}  // namespace opt
}  // namespace spvtools

#endif  // LIBSPIRV_OPT_INLINE_OPAQUE_PASS_H_
