blob: 8e6cfb4892d2b4dd9bae8bf7df1defa0cb5b7cb4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.utils;
import java.util.Arrays;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.core.IAddressFactory;
import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.IBinaryParser.ISymbol;
import org.eclipse.core.runtime.IPath;
/**
*/
public abstract class BinaryObjectAdapter extends BinaryFile implements IBinaryObject {
protected static final ISymbol[] NO_SYMBOLS = new ISymbol[0];
public class BinaryObjectInfo {
public long bss;
public long data;
public long text;
public boolean hasDebug;
public boolean isLittleEndian;
public String soname;
public String[] needed;
public String cpu;
public BinaryObjectInfo() {
cpu = soname = ""; //$NON-NLS-1$
needed = new String[0];
}
}
public BinaryObjectAdapter(IBinaryParser parser, IPath path, int type) {
super(parser, path, type);
}
@Override
public ISymbol getSymbol(IAddress addr) {
ISymbol[] syms = getSymbols();
int insertion = Arrays.binarySearch(syms, addr);
if (insertion >= 0) {
return syms[insertion];
}
if (insertion == -1) {
return null;
}
insertion = -insertion - 1;
ISymbol symbol = syms[insertion - 1];
if (addr.compareTo(symbol.getAddress().add(symbol.getSize())) < 0) {
return syms[insertion - 1];
}
return null;
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getBSS()
*/
@Override
public long getBSS() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.bss;
}
return 0;
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getCPU()
*/
@Override
public String getCPU() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.cpu;
}
return ""; //$NON-NLS-1$
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getData()
*/
@Override
public long getData() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.data;
}
return 0;
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getText()
*/
@Override
public long getText() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.text;
}
return 0;
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#hasDebug()
*/
@Override
public boolean hasDebug() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.hasDebug;
}
return false;
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#isLittleEndian()
*/
@Override
public boolean isLittleEndian() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.isLittleEndian;
}
return false;
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryExecutable#getNeededSharedLibs()
*/
public String[] getNeededSharedLibs() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.needed;
}
return new String[0];
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryShared#getSoName()
*/
public String getSoName() {
BinaryObjectInfo info = getBinaryObjectInfo();
if (info != null) {
return info.soname;
}
return ""; //$NON-NLS-1$
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getName()
*/
@Override
public String getName() {
return getPath().lastSegment().toString();
}
@Override
public String toString() {
return getName();
}
/**
* @see org.eclipse.cdt.core.IBinaryParser.IBinaryObject#getSymbols()
*/
@Override
public abstract ISymbol[] getSymbols();
@Override
public abstract IAddressFactory getAddressFactory();
protected abstract BinaryObjectInfo getBinaryObjectInfo();
}