ELFAttributeValue.cpp revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- ELFAttributeValue.cpp ----------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Target/ELFAttributeValue.h> 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/ErrorHandling.h> 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Support/LEB128.h> 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesusing namespace mcld; 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinessize_t ELFAttributeValue::getSize() const 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines size_t size = 0; 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isIntValue()) 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines size += leb128::size<uint32_t>(m_IntValue); 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isStringValue()) 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines size += m_StringValue.length() + 1 /* for NULL-terminator */; 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (size <= 0) 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // unknown type of the value 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::report_fatal_error("Unknown type of attribtue value!"); 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return size; 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesbool ELFAttributeValue::isDefaultValue() const 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isUninitialized()) { 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // Uninitialized attribute means default value 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return true; 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } else { 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isIntValue() && (m_IntValue != 0)) 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isStringValue() && !m_StringValue.empty()) 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // The value hold in the storage is the "default value by default" (i.e., 0 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // for int type, empty string for string type), but we need to check whether 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // the "default value" is defined (that is, hasNoDefault() = false.) 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return !hasNoDefault(); 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // unreachable 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesbool ELFAttributeValue::equals(const ELFAttributeValue& pValue) const 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if ((pValue.type() != m_Type) || isUninitialized()) 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isIntValue() && (m_IntValue != pValue.getIntValue())) 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (isStringValue() && (m_StringValue != pValue.getStringValue())) 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return true; 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 67