aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
diff options
context:
space:
mode:
authorKarl Schimpf <kschimpf@google.com>2013-08-30 09:10:39 -0700
committerKarl Schimpf <kschimpf@google.com>2013-08-30 09:10:39 -0700
commit06bf94d7c3fd693b3c6e3b71178514e5ed59489a (patch)
tree71cfcd99369833fc7635ffaa1865398a1963bd87 /lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
parent2302e5d39e2302962d1a0e45d60e00ed47b9b061 (diff)
Revert "Remove generating STRUCT_ANON records in PNaCl bitcode files."
This reverts commit 2302e5d39e2302962d1a0e45d60e00ed47b9b061. BUG= R=eliben@chromium.org Review URL: https://codereview.chromium.org/23827002
Diffstat (limited to 'lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp')
-rw-r--r--lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
index 80bf60f2ce..41a2501266 100644
--- a/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
+++ b/lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp
@@ -94,6 +94,7 @@ enum {
// TYPE_BLOCK_ID_NEW abbrev id's.
TYPE_POINTER_ABBREV = naclbitc::FIRST_APPLICATION_ABBREV,
TYPE_FUNCTION_ABBREV,
+ TYPE_STRUCT_ANON_ABBREV,
TYPE_ARRAY_ABBREV,
TYPE_MAX_ABBREV = TYPE_ARRAY_ABBREV
};
@@ -200,6 +201,15 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
if (TYPE_FUNCTION_ABBREV != Stream.EmitAbbrev(Abbv))
llvm_unreachable("Unexpected abbrev ordering!");
+ // Abbrev for TYPE_CODE_STRUCT_ANON.
+ Abbv = new NaClBitCodeAbbrev();
+ Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_ANON));
+ Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // ispacked
+ Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
+ if (TYPE_STRUCT_ANON_ABBREV != Stream.EmitAbbrev(Abbv))
+ llvm_unreachable("Unexpected abbrev ordering!");
+
// Abbrev for TYPE_CODE_ARRAY.
Abbv = new NaClBitCodeAbbrev();
Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_ARRAY));
@@ -251,8 +261,23 @@ static void WriteTypeTable(const NaClValueEnumerator &VE,
AbbrevToUse = TYPE_FUNCTION_ABBREV;
break;
}
- case Type::StructTyID:
- report_fatal_error("Struct types are not supported in PNaCl bitcode");
+ case Type::StructTyID: {
+ StructType *ST = cast<StructType>(T);
+ // STRUCT: [ispacked, eltty x N]
+ TypeVals.push_back(ST->isPacked());
+ // Output all of the element types.
+ for (StructType::element_iterator I = ST->element_begin(),
+ E = ST->element_end(); I != E; ++I)
+ TypeVals.push_back(VE.getTypeID(*I));
+
+ if (ST->isLiteral()) {
+ Code = naclbitc::TYPE_CODE_STRUCT_ANON;
+ AbbrevToUse = TYPE_STRUCT_ANON_ABBREV;
+ } else {
+ report_fatal_error("Non-anon structs not supported in PNaCl bitcode");
+ }
+ break;
+ }
case Type::ArrayTyID: {
ArrayType *AT = cast<ArrayType>(T);
// ARRAY: [numelts, eltty]