191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//===---------------------- FunctionDescriptor.cpp -----------------------===//
291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//                              SPIR Tools
491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// This file is distributed under the University of Illinois Open Source
691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// License. See LICENSE.TXT for details.
791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//===---------------------------------------------------------------------===//
991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni/*
1091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni * Contributed by: Intel Corporation.
1191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni */
1291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
1391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#include "FunctionDescriptor.h"
1491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#include "ParameterType.h"
1591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#include <sstream>
1691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
1791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ninamespace SPIR {
1891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
1991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nistd::string FunctionDescriptor::nullString() {
2091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return std::string("<invalid>");
2191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
2291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
2391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nistd::string FunctionDescriptor::toString() const {
2491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  std::stringstream stream;
2591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (isNull()) {
2691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return FunctionDescriptor::nullString();
2791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  }
2891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  stream << name << "(";
2991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  size_t paramCount = parameters.size();
3091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (paramCount > 0) {
3191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    for (size_t i=0 ; i<paramCount-1 ; ++i)
3291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni      stream << parameters[i]->toString() << ", ";
3391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    stream << parameters[paramCount-1]->toString();
3491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  }
3591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  stream << ")";
3691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return stream.str();
3791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
3891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
3991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nistatic bool equal(const TypeVector& l, const TypeVector& r) {
4091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (&l == &r)
4191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return true;
4291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (l.size() != r.size())
4391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return false;
4491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  TypeVector::const_iterator itl = l.begin(), itr = r.begin(),
4591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  endl = l.end();
4691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  while (itl != endl) {
4791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    if (!(*itl)->equals(*itr))
4891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni      return false;
4991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    ++itl;
5091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    ++itr;
5191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  }
5291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return true;
5391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
5491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
5591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
5691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// FunctionDescriptor
5791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
5891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
5991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nibool FunctionDescriptor::operator == (const FunctionDescriptor& that) const {
6091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (this == &that)
6191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return true;
6291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (name != that.name)
6391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return false;
6491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return equal(parameters, that.parameters);
6591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
6691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
6791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nibool FunctionDescriptor::operator < (const FunctionDescriptor& that) const {
6891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  int strCmp = name.compare(that.name);
6991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (strCmp)
7091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return (strCmp < 0);
7191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  size_t len = parameters.size(), thatLen = that.parameters.size();
7291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if (len != thatLen)
7391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    return len < thatLen;
7491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  TypeVector::const_iterator it = parameters.begin(),
7591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  e = parameters.end(), thatit = that.parameters.begin();
7691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  while (it != e) {
7791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    int cmp = (*it)->toString().compare((*thatit)->toString());
7891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    if (cmp)
7991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni      return (cmp < 0);
8091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    ++thatit;
8191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    ++it;
8291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  }
8391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return false;
8491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
8591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
8691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nibool FunctionDescriptor::isNull() const {
8791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return (name.empty() && parameters.empty());
8891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
8991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
9091585d9acd75a2bdbfd177bf56c8b9436f442152Yang NiFunctionDescriptor FunctionDescriptor::null() {
9191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  FunctionDescriptor fd;
9291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  fd.name = "";
9391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return fd;
9491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
9591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
9691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni} // End SPIR namespace
97