X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BearSSL;a=blobdiff_plain;f=T0%2FT0Comp.cs;h=7a397f7cbc487ab5098c0abeb58d961b69eeefe0;hp=20adc04b06226107d771707379cf61ca3c0fec97;hb=79b1a9996c094ff593ae50bc4edc1f349f39dd6d;hpb=fb7052216d8cb257e47de57e615c3a2f573174de diff --git a/T0/T0Comp.cs b/T0/T0Comp.cs index 20adc04..7a397f7 100644 --- a/T0/T0Comp.cs +++ b/T0/T0Comp.cs @@ -251,6 +251,12 @@ public class T0Comp { */ List extraCode; + /* + * 'extraCodeDefer' is for C code that is to be added in the C + * output _after_ the data and code blocks. + */ + List extraCodeDefer; + /* * 'dataBlock' is the data block in which constant data bytes * are accumulated. @@ -287,6 +293,7 @@ public class T0Comp { StringComparer.Ordinal); compiling = false; extraCode = new List(); + extraCodeDefer = new List(); enableFlowAnalysis = true; /* @@ -348,6 +355,15 @@ public class T0Comp { extraCode.Add(ParseCCode()); }); + /* + * postamble + * Parses a C code snippet, then adds it to the generated + * output after the data and code blocks. + */ + AddNative("postamble", false, SType.BLANK, cpu => { + extraCodeDefer.Add(ParseCCode()); + }); + /* * make-CX * Expects two integers and a string, and makes a @@ -1729,7 +1745,7 @@ t0_parse7E_signed(const unsigned char **p) #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0) -static const uint8_t t0_datablock[]; +/* static const unsigned char t0_datablock[]; */ "); /* @@ -1757,7 +1773,8 @@ static const uint8_t t0_datablock[]; BlobWriter bw; tw.WriteLine(); - tw.Write("static const uint8_t t0_datablock[] = {"); + tw.Write("static const unsigned char" + + " t0_datablock[] = {"); bw = new BlobWriter(tw, 78, 1); bw.Append((byte)0); foreach (ConstData cd in blocks.Values) { @@ -1767,7 +1784,8 @@ static const uint8_t t0_datablock[]; tw.WriteLine("};"); tw.WriteLine(); - tw.Write("static const uint8_t t0_codeblock[] = {"); + tw.Write("static const unsigned char" + + " t0_codeblock[] = {"); bw = new BlobWriter(tw, 78, 1); foreach (CodeElement ce in gcode) { ce.Encode(bw, oneByteCode); @@ -1952,6 +1970,17 @@ t0_exit: ((t0_context *)t0ctx)->rp = rp; ((t0_context *)t0ctx)->ip = ip; }"); + + /* + * Add the "postamblr" elements here. These are + * elements that may need access to the data + * block or code block, so they must occur after + * their definition. + */ + foreach (string pp in extraCodeDefer) { + tw.WriteLine(); + tw.WriteLine("{0}", pp); + } } int codeLen = 0;