X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fdsymutil%2FMachODebugMapParser.cpp;h=bf64303b9eab2872ffcea0abffcbbc3837b98602;hb=60dbe0fd0dbb5f52411a399480b2b8066839de37;hp=fbb5ad6b9ec43d771301473c153d9364675c6585;hpb=5a0743e1e8362cc11d5ac12399034f8a884c0cb8;p=oota-llvm.git diff --git a/tools/dsymutil/MachODebugMapParser.cpp b/tools/dsymutil/MachODebugMapParser.cpp index fbb5ad6b9ec..bf64303b9ea 100644 --- a/tools/dsymutil/MachODebugMapParser.cpp +++ b/tools/dsymutil/MachODebugMapParser.cpp @@ -24,7 +24,8 @@ public: MachODebugMapParser(StringRef BinaryPath, StringRef PathPrefix = "", bool Verbose = false) : BinaryPath(BinaryPath), PathPrefix(PathPrefix), - MainBinaryHolder(Verbose), CurrentObjectHolder(Verbose) {} + MainBinaryHolder(Verbose), CurrentObjectHolder(Verbose), + CurrentDebugMapObject(nullptr) {} /// \brief Parses and returns the DebugMap of the input binary. /// \returns an error in case the provided BinaryPath doesn't exist @@ -50,6 +51,10 @@ private: /// Element of the debug map corresponfing to the current object file. DebugMapObject *CurrentDebugMapObject; + /// Holds function info while function scope processing. + const char *CurrentFunctionName; + uint64_t CurrentFunctionAddress; + void switchToNewDebugMapObject(StringRef Filename); void resetParserState(); uint64_t getMainBinarySymbolAddress(StringRef Name); @@ -96,6 +101,13 @@ void MachODebugMapParser::switchToNewDebugMapObject(StringRef Filename) { CurrentDebugMapObject = &Result->addDebugMapObject(Path); } +static Triple getTriple(const object::MachOObjectFile &Obj) { + Triple TheTriple("unknown-unknown-unknown"); + TheTriple.setArch(Triple::ArchType(Obj.getArch())); + TheTriple.setObjectFormat(Triple::MachO); + return TheTriple; +} + /// This main parsing routine tries to open the main binary and if /// successful iterates over the STAB entries. The real parsing is /// done in handleStabSymbolTableEntry. @@ -106,7 +118,7 @@ ErrorOr> MachODebugMapParser::parse() { const MachOObjectFile &MainBinary = *MainBinOrError; loadMainBinarySymbols(); - Result = make_unique(); + Result = make_unique(getTriple(MainBinary)); MainBinaryStrings = MainBinary.getStringTableData(); for (const SymbolRef &Symbol : MainBinary.symbols()) { const DataRefImpl &DRI = Symbol.getRawDataRefImpl(); @@ -141,6 +153,7 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex, if (!CurrentDebugMapObject) return; + uint32_t Size = 0; switch (Type) { case MachO::N_GSYM: // This is a global variable. We need to query the main binary @@ -151,11 +164,18 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex, return; break; case MachO::N_FUN: - // Functions are scopes in STABS. They have an end marker that we - // need to ignore. - if (Name[0] == '\0') + // Functions are scopes in STABS. They have an end marker that + // contains the function size. + if (Name[0] == '\0') { + Size = Value; + Value = CurrentFunctionAddress; + Name = CurrentFunctionName; + break; + } else { + CurrentFunctionName = Name; + CurrentFunctionAddress = Value; return; - break; + } case MachO::N_STSYM: break; default: @@ -166,7 +186,8 @@ void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t StringIndex, if (ObjectSymIt == CurrentObjectAddresses.end()) return Warning("could not find object file symbol for symbol " + Twine(Name)); - if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(), Value)) + if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(), Value, + Size)) return Warning(Twine("failed to insert symbol '") + Name + "' in the debug map."); } @@ -223,9 +244,8 @@ void MachODebugMapParser::loadMainBinarySymbols() { namespace llvm { namespace dsymutil { -llvm::ErrorOr> parseDebugMap(StringRef InputFile, - StringRef PrependPath, - bool Verbose) { +llvm::ErrorOr> +parseDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose) { MachODebugMapParser Parser(InputFile, PrependPath, Verbose); return Parser.parse(); }