//===- ELFAttributeValue.cpp ----------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "mcld/Target/ELFAttributeValue.h" #include #include "mcld/Support/LEB128.h" namespace mcld { size_t ELFAttributeValue::getSize() const { size_t size = 0; if (isIntValue()) size += leb128::size(m_IntValue); if (isStringValue()) size += m_StringValue.length() + 1 /* for NULL-terminator */; if (size <= 0) // unknown type of the value llvm::report_fatal_error("Unknown type of attribtue value!"); return size; } bool ELFAttributeValue::isDefaultValue() const { if (isUninitialized()) { // Uninitialized attribute means default value return true; } else { if (isIntValue() && (m_IntValue != 0)) return false; if (isStringValue() && !m_StringValue.empty()) return false; // The value hold in the storage is the "default value by default" (i.e., 0 // for int type, empty string for string type), but we need to check whether // the "default value" is defined (that is, hasNoDefault() = false.) return !hasNoDefault(); } // unreachable } bool ELFAttributeValue::equals(const ELFAttributeValue& pValue) const { if ((pValue.type() != m_Type) || isUninitialized()) return false; if (isIntValue() && (m_IntValue != pValue.getIntValue())) return false; if (isStringValue() && (m_StringValue != pValue.getStringValue())) return false; return true; } } // namespace mcld