diff --git a/src/Attribute.cpp b/src/Attribute.cpp index 949e3d067..342108b7b 100644 --- a/src/Attribute.cpp +++ b/src/Attribute.cpp @@ -63,3 +63,20 @@ MultiChoiceAttribute::make_random() else return ""; } + +AlignedAttribute::AlignedAttribute(string name, int prob, int alignment_factor) + : Attribute(name, prob), alignment(alignment_factor) +{ +} + +string +AlignedAttribute::make_random() +{ + if(rnd_flipcoin(prob)){ + ostringstream oss; + oss << (1 << rnd_upto(alignment)); + return name + "(" + oss.str() + ")"; + } + else + return ""; +} diff --git a/src/Attribute.h b/src/Attribute.h index af80da236..804c9a4bb 100644 --- a/src/Attribute.h +++ b/src/Attribute.h @@ -3,6 +3,7 @@ #include #include +#include using namespace std; class AttributeGenerator; @@ -38,6 +39,17 @@ class MultiChoiceAttribute : public Attribute string make_random(); }; +//Generates alignment attribute +class AlignedAttribute : public Attribute +{ +public: + //alignment factor - [functions] = 16 and [types] = 8 i.e. functions can take alignment upto 2^16 where as type can take upto 2^8 + int alignment; + AlignedAttribute(string, int, int); + string make_random(); +}; + +//Generates function and types attributes class AttributeGenerator { public: diff --git a/src/Function.cpp b/src/Function.cpp index f92b7a887..cb150f33f 100644 --- a/src/Function.cpp +++ b/src/Function.cpp @@ -135,6 +135,7 @@ Function::InitializeAttributes() func_attr_generator.attributes.push_back(new MultiChoiceAttribute("visibility", FuncAttrProb, visibility_choices)); func_attr_generator.attributes.push_back(new MultiChoiceAttribute("no_sanitize", FuncAttrProb, sanitize_choices)); + func_attr_generator.attributes.push_back(new AlignedAttribute("aligned", FuncAttrProb, 16)); } }