#include <vector>
#include <map>
-#include <ext/hash_map>
+#include <unordered_map>
+#include <unordered_set>
#include "ld.hpp"
+#include "MachOFileAbstraction.hpp"
#include "dtrace_dof.h"
// prototype for entry point in libdtrace.dylib
Atom(class File& f, const char* n, const uint8_t* content, uint64_t sz);
virtual ld::File* file() const { return (ld::File*)&_file; }
- virtual bool translationUnitSource(const char** dir, const char** ) const
- { return false; }
virtual const char* name() const { return _name; }
virtual uint64_t size() const { return _size; }
virtual uint64_t objectAddress() const { return 0; }
{
public:
File(const char* segmentName, const char* sectionName, const char* pth,
- const uint8_t fileContent[], uint64_t fileLength, uint32_t ord,
+ const uint8_t fileContent[], uint64_t fileLength, Ordinal ord,
const char* symbolName="dof")
- : ld::File(pth, 0, ord),
+ : ld::File(pth, 0, ord, Other),
_atom(*this, symbolName, fileContent, fileLength),
_section(segmentName, sectionName, ld::Section::typeDtraceDOF) { }
virtual ~File() {}
-class CStringEquals
-{
-public:
- bool operator()(const char* left, const char* right) const { return (strcmp(left, right) == 0); }
-};
-
struct DTraceProbeInfo {
DTraceProbeInfo(const ld::Atom* a, uint32_t o, const char* n) : atom(a), offset(o), probeName(n) {}
const ld::Atom* atom;
uint32_t offset;
const char* probeName;
};
-typedef __gnu_cxx::hash_map<const char*, std::vector<DTraceProbeInfo>, __gnu_cxx::hash<const char*>, CStringEquals> ProviderToProbes;
-typedef __gnu_cxx::hash_set<const char*, __gnu_cxx::hash<const char*>, CStringEquals> CStringSet;
+typedef std::unordered_map<const char*, std::vector<DTraceProbeInfo>, CStringHash, CStringEquals> ProviderToProbes;
+typedef std::unordered_set<const char*, CStringHash, CStringEquals> CStringSet;
// only make __dof section in final linked images
if ( opts.outputKind() == Options::kObjectFile )
return;
+
+ // skip making __dof section if command line option said not to
+ if ( ! opts.generateDtraceDOF() )
+ return;
// scan all atoms looking for dtrace probes
std::vector<DTraceProbeInfo> probeSites;
for (ld::Fixup::iterator fit = atom->fixupsBegin(), end=atom->fixupsEnd(); fit != end; ++fit) {
switch ( fit->kind ) {
case ld::Fixup::kindStoreX86DtraceCallSiteNop:
- case ld::Fixup::kindStorePPCDtraceCallSiteNop:
case ld::Fixup::kindStoreARMDtraceCallSiteNop:
case ld::Fixup::kindStoreThumbDtraceCallSiteNop:
+ case ld::Fixup::kindStoreARM64DtraceCallSiteNop:
probeSites.push_back(DTraceProbeInfo(atom, fit->offsetInAtom, fit->u.name));
break;
case ld::Fixup::kindStoreX86DtraceIsEnableSiteClear:
- case ld::Fixup::kindStorePPCDtraceIsEnableSiteClear:
case ld::Fixup::kindStoreARMDtraceIsEnableSiteClear:
case ld::Fixup::kindStoreThumbDtraceIsEnableSiteClear:
+ case ld::Fixup::kindStoreARM64DtraceIsEnableSiteClear:
isEnabledSites.push_back(DTraceProbeInfo(atom, fit->offsetInAtom, fit->u.name));
break;
case ld::Fixup::kindDtraceExtra:
ld::Fixup::Kind storeKind = ld::Fixup::kindNone;
switch ( opts.architecture() ) {
- case CPU_TYPE_POWERPC:
- case CPU_TYPE_POWERPC64:
- storeKind = ld::Fixup::kindStoreBigEndian32;
- break;
case CPU_TYPE_I386:
case CPU_TYPE_X86_64:
case CPU_TYPE_ARM:
+ case CPU_TYPE_ARM64:
storeKind = ld::Fixup::kindStoreLittleEndian32;
break;
default:
sectionNamesUsed.insert(sectionName);
char symbolName[strlen(providerName)+64];
sprintf(symbolName, "__dtrace_dof_for_provider_%s", providerName);
- File* f = new File("__TEXT", sectionName, "dtrace", p, dofSectionSize, 0, symbolName);
+ File* f = new File("__TEXT", sectionName, "dtrace", p, dofSectionSize, ld::File::Ordinal::NullOrdinal(), symbolName);
if ( log ) {
fprintf(stderr, "libdtrace created DOF of size %ld\n", dofSectionSize);
}