aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Object
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-12-19 14:15:04 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-12-19 14:15:04 +0000
commitf9a6bd8524ba16d3e4036304ffdc9475df6844f2 (patch)
tree4a263ee3236aac64ede2a1e4ba25012eb9f8d4db /lib/Object
parent33660cdfbd521f39982e86844db6784848b8f5d5 (diff)
downloadexternal_llvm-f9a6bd8524ba16d3e4036304ffdc9475df6844f2.zip
external_llvm-f9a6bd8524ba16d3e4036304ffdc9475df6844f2.tar.gz
external_llvm-f9a6bd8524ba16d3e4036304ffdc9475df6844f2.tar.bz2
Add r170095 back.
I cannot reproduce it the failures locally, so I will keep an eye at the ppc bots. This patch does add the change to the "Disassembly of section" message, but that is not what was failing on the bots. Original message: Add a funciton to get the segment name of a section. On MachO, sections also have segment names. When a tool looking at a .o file prints a segment name, this is what they mean. In reality, a .o has only one anonymous, segment. This patch adds a MachO only function to fetch that segment name. I named it getSectionFinalSegmentName since the main use for the name seems to be infor the linker with segment this section should go to. The patch also changes MachOObjectFile::getSectionName to return just the section name instead of computing SegmentName,SectionName. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170545 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Object')
-rw-r--r--lib/Object/MachOObjectFile.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 40f5390..3e29b2f 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -473,28 +473,43 @@ static bool is64BitLoadCommand(const MachOObject *MachOObj, DataRefImpl DRI) {
return false;
}
+static StringRef parseSegmentOrSectionName(const char *P) {
+ if (P[15] == 0)
+ // Null terminated.
+ return P;
+ // Not null terminated, so this is a 16 char string.
+ return StringRef(P, 16);
+}
+
error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
StringRef &Result) const {
- // FIXME: thread safety.
- static char result[34];
if (is64BitLoadCommand(MachOObj.get(), DRI)) {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
InMemoryStruct<macho::Section64> Sect;
MachOObj->ReadSection64(LCI, DRI.d.b, Sect);
-
- strcpy(result, Sect->SegmentName);
- strcat(result, ",");
- strcat(result, Sect->Name);
+ Result = parseSegmentOrSectionName(Sect->Name);
} else {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
InMemoryStruct<macho::Section> Sect;
MachOObj->ReadSection(LCI, DRI.d.b, Sect);
+ Result = parseSegmentOrSectionName(Sect->Name);
+ }
+ return object_error::success;
+}
- strcpy(result, Sect->SegmentName);
- strcat(result, ",");
- strcat(result, Sect->Name);
+error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec,
+ StringRef &Res) const {
+ if (is64BitLoadCommand(MachOObj.get(), Sec)) {
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a);
+ InMemoryStruct<macho::Section64> Sect;
+ MachOObj->ReadSection64(LCI, Sec.d.b, Sect);
+ Res = parseSegmentOrSectionName(Sect->SegmentName);
+ } else {
+ LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a);
+ InMemoryStruct<macho::Section> Sect;
+ MachOObj->ReadSection(LCI, Sec.d.b, Sect);
+ Res = parseSegmentOrSectionName(Sect->SegmentName);
}
- Result = StringRef(result);
return object_error::success;
}