aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/ARM/ARMAsmPrinter.cpp36
1 files changed, 15 insertions, 21 deletions
diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp
index 61445c3237..01ad2f5ad8 100644
--- a/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -95,8 +95,6 @@ namespace {
class ObjectAttributeEmitter : public AttributeEmitter {
MCObjectStreamer &Streamer;
- size_t SectionStart;
- size_t TagStart;
StringRef CurrentVendor;
SmallString<64> Contents;
@@ -116,20 +114,7 @@ namespace {
CurrentVendor = Vendor;
- SectionStart = Contents.size();
-
- // Length of the data for this vendor.
- Contents.append(4, (char)0);
-
- Contents.append(Vendor.begin(), Vendor.end());
- Contents += 0;
-
- Contents += ARMBuildAttrs::File;
-
- TagStart = Contents.size();
-
- // Length of the data for this tag.
- Contents.append(4, (char)0);
+ assert(Contents.size() == 0);
}
void EmitAttribute(unsigned Attribute, unsigned Value) {
@@ -139,15 +124,24 @@ namespace {
}
void Finish() {
- size_t EndPos = Contents.size();
+ const size_t ContentsSize = Contents.size();
+
+ // Vendor size + Vendor name + '\0'
+ const size_t VendorHeaderSize = 4 + CurrentVendor.size() + 1;
- // FIXME: endian.
- *((uint32_t*)&Contents[SectionStart]) = EndPos - SectionStart;
+ // Tag + Tag Size
+ const size_t TagHeaderSize = 1 + 4;
- // +1 since it includes the tag that came before it.
- *((uint32_t*)&Contents[TagStart]) = EndPos - TagStart + 1;
+ Streamer.EmitIntValue(VendorHeaderSize + TagHeaderSize + ContentsSize, 4);
+ Streamer.EmitBytes(CurrentVendor, 0);
+ Streamer.EmitIntValue(0, 1); // '\0'
+
+ Streamer.EmitIntValue(ARMBuildAttrs::File, 1);
+ Streamer.EmitIntValue(TagHeaderSize + ContentsSize, 4);
Streamer.EmitBytes(Contents, 0);
+
+ Contents.clear();
}
};