gollvm: remove lhs/rhs context from Backend::var_expression()
Remove the LHS/RHS context flag from the Backend::var_expression()
method. This info is computed locally as part of the materialization
phase, and doesn't need to be generated in the front end. See related
gofrontend change https://go-review.googlesource.com/c/gofrontend/+/77510.
Change-Id: Ie091d4a08d4f7710af19a05fa4b6796978727c77
Reviewed-on: https://go-review.googlesource.com/77511
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/llvm-gofrontend/go-llvm-bexpression.h b/llvm-gofrontend/go-llvm-bexpression.h
index ad6e1e5..4c430c1 100644
--- a/llvm-gofrontend/go-llvm-bexpression.h
+++ b/llvm-gofrontend/go-llvm-bexpression.h
@@ -106,6 +106,12 @@
bool pending_;
};
+// Whether a variable expression appears in lvalue (assignment) context.
+enum Varexpr_context {
+ VE_rvalue,
+ VE_lvalue
+};
+
// Bexpression is the backend representation of an expression, meaning
// that it produces a value (llvm::Value) and will encapsulate some
// set of instructions (llvm::Instruction) needed to produce that
diff --git a/llvm-gofrontend/go-llvm-materialize.cpp b/llvm-gofrontend/go-llvm-materialize.cpp
index 8152e39..6a093ff 100644
--- a/llvm-gofrontend/go-llvm-materialize.cpp
+++ b/llvm-gofrontend/go-llvm-materialize.cpp
@@ -443,7 +443,7 @@
// nil_pointer_expression, which is untyped/polymorphic).
// Assume that the type checking in the call to
// assignment_statement will catch any problems.
- Bexpression *varExpr = var_expression(tempv, VE_lvalue, location);
+ Bexpression *varExpr = var_expression(tempv, location);
elseStmt = assignment_statement(function, varExpr, else_expr, location);
}
}
@@ -455,7 +455,7 @@
thenBlock, elseBlock, location);
Bexpression *rval = (tempv ?
- var_expression(tempv, VE_rvalue, location) :
+ var_expression(tempv, location) :
nbuilder_.mkVoidValue(void_type()));
Bexpression *result =
materialize(compound_expression(ifStmt, rval, location));
diff --git a/llvm-gofrontend/go-llvm.cpp b/llvm-gofrontend/go-llvm.cpp
index c31c74f..f8e9099 100644
--- a/llvm-gofrontend/go-llvm.cpp
+++ b/llvm-gofrontend/go-llvm.cpp
@@ -900,7 +900,6 @@
// An expression that references a variable.
Bexpression *Llvm_backend::var_expression(Bvariable *var,
- Varexpr_context in_lvalue_pos,
Location location)
{
if (var == errorVariable_.get())
@@ -1700,7 +1699,7 @@
} else if (structVal->isConstant()) {
llvm::Constant *cval = llvm::cast<llvm::Constant>(structVal->value());
Bvariable *cv = genVarForConstant(cval, structVal->btype());
- structVal = var_expression(cv, VE_rvalue, location);
+ structVal = var_expression(cv, location);
structVal = materialize(address_expression(structVal, location));
}
toret = structVal;
diff --git a/llvm-gofrontend/go-llvm.h b/llvm-gofrontend/go-llvm.h
index 33ee6f2..14798c5 100644
--- a/llvm-gofrontend/go-llvm.h
+++ b/llvm-gofrontend/go-llvm.h
@@ -144,8 +144,7 @@
Bexpression *nil_pointer_expression();
- Bexpression *var_expression(Bvariable *var, Varexpr_context in_lvalue_pos,
- Location);
+ Bexpression *var_expression(Bvariable *var, Location);
Bexpression *indirect_expression(Btype *, Bexpression *expr, bool known_valid,
Location);
diff --git a/unittests/BackendCore/BackendArrayStruct.cpp b/unittests/BackendCore/BackendArrayStruct.cpp
index d2c4ad1..42b043c 100644
--- a/unittests/BackendCore/BackendArrayStruct.cpp
+++ b/unittests/BackendCore/BackendArrayStruct.cpp
@@ -38,30 +38,30 @@
// var loc2 *X = &loc1
Btype *ps2t = be->pointer_type(s2t);
- Bexpression *bl1vex = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *bl1vex = be->var_expression(loc1, loc);
Bexpression *adl1 = be->address_expression(bl1vex, loc);
Bvariable *loc2 = h.mkLocal("loc2", ps2t, adl1);
// var x int32
// x = loc1.f2
Bvariable *x = h.mkLocal("x", bi32t);
- Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
- Bexpression *sex = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(x, loc);
+ Bexpression *sex = be->var_expression(loc1, loc);
Bexpression *fex = be->struct_field_expression(sex, 1, loc);
h.mkAssign(vex, fex);
// var b2 bool
// loc1.b = &b2
Bvariable *b2 = h.mkLocal("b2", bt);
- Bexpression *lvex = be->var_expression(loc1, VE_lvalue, loc);
+ Bexpression *lvex = be->var_expression(loc1, loc);
Bexpression *bfex = be->struct_field_expression(lvex, 0, loc);
- Bexpression *b2ex = be->var_expression(b2, VE_rvalue, loc);
+ Bexpression *b2ex = be->var_expression(b2, loc);
Bexpression *adb2 = be->address_expression(b2ex, loc);
h.mkAssign(bfex, adb2);
// var b2 bool
// loc2.f2 = 2 (equivalent to (*loc2).f2 = 2)
- Bexpression *lvexi = be->var_expression(loc2, VE_lvalue, loc);
+ Bexpression *lvexi = be->var_expression(loc2, loc);
bool knValid = false;
Bexpression *lindx = be->indirect_expression(s2t, lvexi, knValid, loc);
Bexpression *bfex2 = be->struct_field_expression(lindx, 1, loc);
@@ -116,8 +116,8 @@
Bvariable *y = h.mkLocal("y", bi32t);
std::vector<Bexpression *> vals1;
vals1.push_back(be->zero_expression(pbt));
- vals1.push_back(be->var_expression(y, VE_rvalue, loc));
- Bexpression *vex1 = be->var_expression(x, VE_lvalue, loc);
+ vals1.push_back(be->var_expression(y, loc));
+ Bexpression *vex1 = be->var_expression(x, loc);
Bexpression *sex1 = be->constructor_expression(s2t, vals1, loc);
Bexpression *fex1 = be->struct_field_expression(sex1, 1, loc);
h.mkAssign(vex1, fex1);
@@ -129,7 +129,7 @@
std::vector<Bexpression *> vals2;
vals2.push_back(be->zero_expression(pbt));
vals2.push_back(mkInt32Const(be, int32_t(42)));
- Bexpression *vex2 = be->var_expression(z, VE_lvalue, loc);
+ Bexpression *vex2 = be->var_expression(z, loc);
Bexpression *sex2 = be->constructor_expression(s2t, vals2, loc);
Bexpression *fex2 = be->struct_field_expression(sex2, 1, loc);
h.mkAssign(vex2, fex2);
@@ -184,12 +184,12 @@
Bvariable *y = h.mkLocal("y", bi64t);
std::vector<unsigned long> indexes = { 0, 1, 2, 3 };
std::vector<Bexpression *> vals1;
- vals1.push_back(be->var_expression(y, VE_rvalue, loc));
+ vals1.push_back(be->var_expression(y, loc));
vals1.push_back(mkInt64Const(be, 3));
vals1.push_back(mkInt64Const(be, 2));
vals1.push_back(mkInt64Const(be, 1));
Bexpression *aex1 = be->array_constructor_expression(at4, indexes, vals1, loc);
- Bexpression *vex1 = be->var_expression(x, VE_lvalue, loc);
+ Bexpression *vex1 = be->var_expression(x, loc);
Bexpression *bi32one = mkInt32Const(be, 1);
Bexpression *eex1 = be->array_index_expression(aex1, bi32one, loc);
h.mkAssign(vex1, eex1);
@@ -202,7 +202,7 @@
for (int64_t v : {4, 3, 2, 1})
vals2.push_back(mkInt64Const(be, v));
Bexpression *aex2 = be->array_constructor_expression(at4, indexes, vals2, loc);
- Bexpression *vex2 = be->var_expression(z, VE_lvalue, loc);
+ Bexpression *vex2 = be->var_expression(z, loc);
Bexpression *eex2 = be->array_index_expression(aex2, bi32one, loc);
h.mkAssign(vex2, eex2);
@@ -214,8 +214,8 @@
for (int64_t v : {4, 3, 2, 1})
vals3.push_back(mkInt64Const(be, v));
Bexpression *aex3 = be->array_constructor_expression(at4, indexes, vals3, loc);
- Bexpression *vex3 = be->var_expression(w, VE_lvalue, loc);
- Bexpression *iex3 = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *vex3 = be->var_expression(w, loc);
+ Bexpression *iex3 = be->var_expression(x, loc);
Bexpression *eex3 = be->array_index_expression(aex3, iex3, loc);
h.mkAssign(vex3, eex3);
@@ -288,7 +288,7 @@
Bvariable *z = h.mkLocal("z", bi64t);
std::vector<unsigned long> indexes3 = { 1 };
std::vector<Bexpression *> vals3;
- vals3.push_back(be->var_expression(z, VE_rvalue, loc));
+ vals3.push_back(be->var_expression(z, loc));
Bexpression *arcon3 =
be->array_constructor_expression(at4, indexes3, vals3, loc);
h.mkLocal("ac", at4, arcon3);
@@ -346,9 +346,9 @@
// var loc2 X = { ¶m1, loc1.f2 }
Bvariable *p1 = func->getNthParamVar(0);
- Bexpression *ve1 = be->var_expression(p1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(p1, loc);
Bexpression *adp = be->address_expression(ve1, loc);
- Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(loc1, loc);
Bexpression *fex = be->struct_field_expression(ve2, 1, loc);
std::vector<Bexpression *> vals2;
vals2.push_back(adp);
@@ -398,7 +398,7 @@
// var l1 Y = Y{ X{nil, 3}, 3.0}
std::vector<Bexpression *> vals1;
Bvariable *p1 = func->getNthParamVar(0);
- Bexpression *ve1 = be->var_expression(p1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(p1, loc);
Bexpression *adp = be->address_expression(ve1, loc);
vals1.push_back(adp);
vals1.push_back(mkInt32Const(be, int32_t(3)));
@@ -411,7 +411,7 @@
Bexpression *scon2 =
be->constructor_expression(syt, vals2, loc);
Bvariable *loc1 = h.mkLocal("loc1", syt);
- Bexpression *vex = be->var_expression(loc1, VE_lvalue, loc);
+ Bexpression *vex = be->var_expression(loc1, loc);
h.mkAssign(vex, scon2);
const char *exp = R"RAW_RESULT(
@@ -455,10 +455,10 @@
// *p0 = { p1, 101 }
Bvariable *p0 = func->getNthParamVar(0);
Bvariable *p1 = func->getNthParamVar(1);
- Bexpression *ve = be->var_expression(p0, VE_lvalue, loc);
+ Bexpression *ve = be->var_expression(p0, loc);
Bexpression *dex = be->indirect_expression(s2t, ve, false, loc);
std::vector<Bexpression *> vals;
- vals.push_back(be->var_expression(p1, VE_rvalue, loc));
+ vals.push_back(be->var_expression(p1, loc));
vals.push_back(mkInt32Const(be, int32_t(101)));
Bexpression *scon =
be->constructor_expression(s2t, vals, loc);
@@ -499,19 +499,19 @@
false, /* is_hidden */
false, /* unique_section */
loc);
- Bexpression *xvex = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *xvex = be->var_expression(x, loc);
std::vector<Bexpression *> vals1 = {xvex};
Bexpression *scon1 = be->constructor_expression(s1t, vals1, loc);
Bvariable *t = be->global_variable("t", "t", s1t, false, /* is_external */
false, /* is_hidden */
false, /* unique_section */
loc);
- Bexpression *tvex = be->var_expression(t, VE_lvalue, loc);
+ Bexpression *tvex = be->var_expression(t, loc);
h.mkAssign(tvex, scon1);
// Construct a struct with a field from a field of global var
// var t2 = T{t.x}
- Bexpression *tvex2 = be->var_expression(t, VE_rvalue, loc);
+ Bexpression *tvex2 = be->var_expression(t, loc);
Bexpression *fex = be->struct_field_expression(tvex2, 0, loc);
std::vector<Bexpression *> vals2 = {fex};
Bexpression *scon2 = be->constructor_expression(s1t, vals2, loc);
@@ -552,20 +552,20 @@
// aa[1]
Bexpression *bi32one = mkInt32Const(be, 1);
- Bexpression *vea1 = be->var_expression(aa, VE_rvalue, loc);
+ Bexpression *vea1 = be->var_expression(aa, loc);
Bexpression *aa1 = be->array_index_expression(vea1, bi32one, loc);
// aa[3]
Bexpression *bi64three = mkInt64Const(be, 3);
- Bexpression *vea2 = be->var_expression(aa, VE_rvalue, loc);
+ Bexpression *vea2 = be->var_expression(aa, loc);
Bexpression *aa2 = be->array_index_expression(vea2, bi64three, loc);
// aa[aa[3]]
- Bexpression *vea3 = be->var_expression(aa, VE_rvalue, loc);
+ Bexpression *vea3 = be->var_expression(aa, loc);
Bexpression *aa3 = be->array_index_expression(vea3, aa2, loc);
// aa[aa[1]]
- Bexpression *vea4 = be->var_expression(aa, VE_lvalue, loc);
+ Bexpression *vea4 = be->var_expression(aa, loc);
Bexpression *aa4 = be->array_index_expression(vea4, aa1, loc);
// aa[aa[1]] = aa[aa[3]]
@@ -628,7 +628,7 @@
// t1[7].ar[3].x = 5
{
- Bexpression *vt = be->var_expression(t1, VE_lvalue, loc);
+ Bexpression *vt = be->var_expression(t1, loc);
Bexpression *bi32sev = mkInt32Const(be, 7);
Bexpression *ti7 = be->array_index_expression(vt, bi32sev, loc);
bool knValid = true;
@@ -663,7 +663,7 @@
// q := t1[0].ar[0].y
{
- Bexpression *vt = be->var_expression(t1, VE_rvalue, loc);
+ Bexpression *vt = be->var_expression(t1, loc);
Bexpression *bi32zero = mkInt32Const(be, 0);
Bexpression *ti0 = be->array_index_expression(vt, bi32zero, loc);
bool knValid = true;
@@ -717,11 +717,11 @@
// x1 = y1
// x2 = y2
- Bexpression *ve1 = be->var_expression(x1, VE_lvalue, loc);
- Bexpression *ve2 = be->var_expression(y1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(x1, loc);
+ Bexpression *ve2 = be->var_expression(y1, loc);
h.mkAssign(ve1, ve2);
- Bexpression *ve3 = be->var_expression(x2, VE_lvalue, loc);
- Bexpression *ve4 = be->var_expression(y2, VE_rvalue, loc);
+ Bexpression *ve3 = be->var_expression(x2, loc);
+ Bexpression *ve4 = be->var_expression(y2, loc);
h.mkAssign(ve3, ve4);
const char *exp = R"RAW_RESULT(
@@ -770,7 +770,7 @@
// var a1 = &t1.f1
// var a2 = &t2.f1
Bvariable *t1 = h.mkLocal("t1", s1t);
- Bexpression *t1vex = be->var_expression(t1, VE_rvalue, loc);
+ Bexpression *t1vex = be->var_expression(t1, loc);
Bexpression *fex1 = be->struct_field_expression(t1vex, 0, loc);
Bexpression *aex1 = be->address_expression(fex1, loc);
h.mkLocal("a1", bpi32t, aex1);
@@ -779,7 +779,7 @@
false, /* is_hidden */
false, /* unique_section */
loc);
- Bexpression *t2vex = be->var_expression(t2, VE_rvalue, loc);
+ Bexpression *t2vex = be->var_expression(t2, loc);
Bexpression *fex2 = be->struct_field_expression(t2vex, 0, loc);
Bexpression *aex2 = be->address_expression(fex2, loc);
h.mkLocal("a2", bpi32t, aex2);
diff --git a/unittests/BackendCore/BackendCABIOracleTests.cpp b/unittests/BackendCore/BackendCABIOracleTests.cpp
index c674707..2867cfa 100644
--- a/unittests/BackendCore/BackendCABIOracleTests.cpp
+++ b/unittests/BackendCore/BackendCABIOracleTests.cpp
@@ -276,7 +276,7 @@
// sm1 == 0
Bvariable *p3 = func->getNthParamVar(3);
Location loc;
- Bexpression *vex = be->var_expression(p3, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(p3, loc);
Bexpression *c0 = be->convert_expression(bu8t, mkInt32Const(be, 0), loc);
Bexpression *eq = be->binary_expression(OPERATOR_EQEQ, vex, c0, loc);
@@ -284,30 +284,30 @@
Bexpression *fn = be->function_code_expression(func, loc);
std::vector<Bexpression *> args;
Bvariable *p0 = func->getNthParamVar(0);
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
+ args.push_back(be->var_expression(p0, loc));
Bvariable *p1 = func->getNthParamVar(1);
- args.push_back(be->var_expression(p1, VE_rvalue, loc));
+ args.push_back(be->var_expression(p1, loc));
Bvariable *p2 = func->getNthParamVar(2);
- args.push_back(be->var_expression(p2, VE_rvalue, loc));
+ args.push_back(be->var_expression(p2, loc));
Bvariable *p3x = func->getNthParamVar(3);
- Bexpression *vex3 = be->var_expression(p3x, VE_rvalue, loc);
+ Bexpression *vex3 = be->var_expression(p3x, loc);
Bexpression *c1 = be->convert_expression(bu8t, mkInt32Const(be, 1), loc);
Bexpression *minus = be->binary_expression(OPERATOR_MINUS, vex3, c1, loc);
args.push_back(minus);
Bvariable *p4 = func->getNthParamVar(4);
- args.push_back(be->var_expression(p4, VE_rvalue, loc));
+ args.push_back(be->var_expression(p4, loc));
Bvariable *p5 = func->getNthParamVar(5);
- args.push_back(be->var_expression(p5, VE_rvalue, loc));
+ args.push_back(be->var_expression(p5, loc));
Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
// return y
std::vector<Bexpression *> rvals1;
- rvals1.push_back(be->var_expression(p1, VE_rvalue, loc));
+ rvals1.push_back(be->var_expression(p1, loc));
Bstatement *rst1 = h.mkReturn(rvals1, FcnTestHarness::NoAppend);
// return call
@@ -367,7 +367,7 @@
// foo(fp)
Location loc;
Bvariable *p0 = func->getNthParamVar(0);
- Bexpression *vex = be->var_expression(p0, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(p0, loc);
Bexpression *fn = be->function_code_expression(func, loc);
std::vector<Bexpression *> args;
args.push_back(vex);
@@ -418,11 +418,11 @@
Bexpression *fn = be->function_code_expression(func, loc);
Bvariable *p0 = func->getNthParamVar(0);
std::vector<Bexpression *> args;
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
+ args.push_back(be->var_expression(p0, loc));
+ args.push_back(be->var_expression(p0, loc));
args.push_back(mkInt32Const(be, 4));
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
+ args.push_back(be->var_expression(p0, loc));
+ args.push_back(be->var_expression(p0, loc));
Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
// return the call above
@@ -485,8 +485,8 @@
Location loc;
Bvariable *x = func->getNthParamVar(0);
Bvariable *y = func->getNthParamVar(1);
- Bexpression *xvex = be->var_expression(x, VE_rvalue, loc);
- Bexpression *yvex = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *xvex = be->var_expression(x, loc);
+ Bexpression *yvex = be->var_expression(y, loc);
Bexpression *fn1 = be->function_code_expression(func, loc);
std::vector<Bexpression *> args1 = {xvex, yvex};
Bexpression *call1 = be->call_expression(func, fn1, args1, nullptr, h.loc());
diff --git a/unittests/BackendCore/BackendCallTests.cpp b/unittests/BackendCore/BackendCallTests.cpp
index 3a9993d..cc000be 100644
--- a/unittests/BackendCore/BackendCallTests.cpp
+++ b/unittests/BackendCore/BackendCallTests.cpp
@@ -34,7 +34,7 @@
args.push_back(be->zero_expression(bpi64t));
Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
Bvariable *x = h.mkLocal("x", bi64t, call);
- h.mkReturn(be->var_expression(x, VE_rvalue, loc));
+ h.mkReturn(be->var_expression(x, loc));
const char *exp = R"RAW_RESULT(
%call.0 = call i64 @foo(i8* nest undef, i32 3, i32 6, i64* null)
@@ -126,7 +126,7 @@
// return p8, nil, nil, 101
//
Bvariable *p1 = func->getNthParamVar(0);
- Bexpression *vex = be->var_expression(p1, VE_rvalue, Location());
+ Bexpression *vex = be->var_expression(p1, Location());
std::vector<Bexpression *> rvals2 = {
vex,
be->nil_pointer_expression(),
@@ -157,7 +157,7 @@
// If statement
Location loc;
- Bexpression *ve2 = be->var_expression(p1, VE_rvalue, Location());
+ Bexpression *ve2 = be->var_expression(p1, Location());
Bexpression *npe = be->nil_pointer_expression();
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ve2, npe, loc);
h.mkIf(cmp, s1, s2);
diff --git a/unittests/BackendCore/BackendDebugEmit.cpp b/unittests/BackendCore/BackendDebugEmit.cpp
index b6f6a82..96fbaa8 100644
--- a/unittests/BackendCore/BackendDebugEmit.cpp
+++ b/unittests/BackendCore/BackendDebugEmit.cpp
@@ -134,11 +134,11 @@
Bvariable *p0 = func->getNthParamVar(0);
Bvariable *p1 = func->getNthParamVar(1);
std::vector<Bexpression *> args;
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
- args.push_back(be->var_expression(p1, VE_rvalue, loc));
+ args.push_back(be->var_expression(p0, loc));
+ args.push_back(be->var_expression(p1, loc));
args.push_back(mkInt32Const(be, 4));
- args.push_back(be->var_expression(p0, VE_rvalue, loc));
- args.push_back(be->var_expression(p1, VE_rvalue, loc));
+ args.push_back(be->var_expression(p0, loc));
+ args.push_back(be->var_expression(p1, loc));
Bexpression *call = be->call_expression(func, fn, args, nullptr, h.loc());
std::vector<Bexpression *> rvals;
rvals.push_back(call);
diff --git a/unittests/BackendCore/BackendExprTests.cpp b/unittests/BackendCore/BackendExprTests.cpp
index 6ace017..92b53c5 100644
--- a/unittests/BackendCore/BackendExprTests.cpp
+++ b/unittests/BackendCore/BackendExprTests.cpp
@@ -225,7 +225,7 @@
Btype *bi32t = be->integer_type(false, 32);
Btype *s2t = mkBackendStruct(be, bi32t, "f1", bi32t, "f2", nullptr);
Btype *ps2t = be->pointer_type(s2t);
- Bexpression *vex = be->var_expression(xv, VE_lvalue, loc);
+ Bexpression *vex = be->var_expression(xv, loc);
Bexpression *adx = be->address_expression(vex, loc);
Bexpression *cast = be->convert_expression(ps2t, adx, loc);
Bexpression *dex = be->indirect_expression(s2t, cast, false, loc);
@@ -264,7 +264,7 @@
// *(*int32)parm3 = 5
{
Bvariable *p3 = func->getNthParamVar(2);
- Bexpression *ve = be->var_expression(p3, VE_lvalue, loc);
+ Bexpression *ve = be->var_expression(p3, loc);
Bexpression *conv = be->convert_expression(bpi32t, ve, loc);
Bexpression *dex = be->indirect_expression(bi32t, conv, false, loc);
h.mkAssign(dex, mkInt32Const(be, 5));
@@ -276,7 +276,7 @@
Btype *bf64t = be->float_type(64);
Btype *bu64t = be->integer_type(true, 64);
Bvariable *p = h.mkLocal("p", bf64t);
- Bexpression *ve = be->var_expression(p, VE_rvalue, loc);
+ Bexpression *ve = be->var_expression(p, loc);
Bexpression *conv = be->convert_expression(bu64t, ve, loc);
Bexpression *conv2 = be->convert_expression(bpi32t, conv, loc);
Bexpression *dex = be->indirect_expression(bi32t, conv2, false, loc);
@@ -330,12 +330,12 @@
for (unsigned ii = 0; ii < jj; ++ii) {
Bvariable *vii = parms[ii];
Bvariable *vjj = parms[jj];
- Bexpression *vel1 = be->var_expression(vii, VE_lvalue, loc);
- Bexpression *ver1 = be->var_expression(vjj, VE_rvalue, loc);
+ Bexpression *vel1 = be->var_expression(vii, loc);
+ Bexpression *ver1 = be->var_expression(vjj, loc);
Bexpression *conv1 = be->convert_expression(vel1->btype(), ver1, loc);
h.mkAssign(vel1, conv1);
- Bexpression *vel2 = be->var_expression(vjj, VE_lvalue, loc);
- Bexpression *ver2 = be->var_expression(vii, VE_rvalue, loc);
+ Bexpression *vel2 = be->var_expression(vjj, loc);
+ Bexpression *ver2 = be->var_expression(vii, loc);
Bexpression *conv2 = be->convert_expression(vel2->btype(), ver2, loc);
h.mkAssign(vel2, conv2);
}
@@ -455,27 +455,27 @@
Bvariable *y = h.mkLocal("y", bc128t);
// a = complex64(x)
- Bexpression *avex1 = be->var_expression(a, VE_lvalue, loc);
- Bexpression *xvex1 = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *avex1 = be->var_expression(a, loc);
+ Bexpression *xvex1 = be->var_expression(x, loc);
Bexpression *convex1 = be->convert_expression(bc64t, xvex1, loc);
h.mkAssign(avex1, convex1);
// y = complex128(b)
- Bexpression *yvex2 = be->var_expression(y, VE_lvalue, loc);
- Bexpression *bvex2 = be->var_expression(b, VE_rvalue, loc);
+ Bexpression *yvex2 = be->var_expression(y, loc);
+ Bexpression *bvex2 = be->var_expression(b, loc);
Bexpression *convex2 = be->convert_expression(bc128t, bvex2, loc);
h.mkAssign(yvex2, convex2);
// No-op conversions
// a = complex64(b)
- Bexpression *avex3 = be->var_expression(a, VE_lvalue, loc);
- Bexpression *bvex3 = be->var_expression(b, VE_rvalue, loc);
+ Bexpression *avex3 = be->var_expression(a, loc);
+ Bexpression *bvex3 = be->var_expression(b, loc);
Bexpression *convex3 = be->convert_expression(bc64t, bvex3, loc);
h.mkAssign(avex3, convex3);
// x = complex128(y)
- Bexpression *xvex4 = be->var_expression(x, VE_lvalue, loc);
- Bexpression *yvex4 = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *xvex4 = be->var_expression(x, loc);
+ Bexpression *yvex4 = be->var_expression(y, loc);
Bexpression *convex4 = be->convert_expression(bc128t, yvex4, loc);
h.mkAssign(xvex4, convex4);
@@ -561,21 +561,21 @@
// We should get a distinct Bexpression each time we create a new
// var expression.
- Bexpression *ve1 = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(loc1, loc);
EXPECT_EQ(repr(ve1->value()), "%loc1 = alloca i64");
h.mkExprStmt(ve1);
- Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(loc1, loc);
h.mkExprStmt(ve2);
EXPECT_EQ(repr(ve2->value()), "%loc1 = alloca i64");
EXPECT_NE(ve1, ve2);
// Same here.
- Bexpression *ve3 = be->var_expression(loc1, VE_lvalue, loc);
- Bexpression *ve3r = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve3 = be->var_expression(loc1, loc);
+ Bexpression *ve3r = be->var_expression(loc1, loc);
EXPECT_EQ(repr(ve3->value()), "%loc1 = alloca i64");
h.mkAssign(ve3, ve3r);
- Bexpression *ve4 = be->var_expression(loc1, VE_lvalue, loc);
- Bexpression *ve4r = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve4 = be->var_expression(loc1, loc);
+ Bexpression *ve4r = be->var_expression(loc1, loc);
EXPECT_EQ(repr(ve4->value()), "%loc1 = alloca i64");
EXPECT_NE(ve3, ve4);
h.mkAssign(ve4, ve4r);
@@ -611,7 +611,7 @@
Bexpression *bleft = valtotest[tidx].first;
Bvariable *bv = valtotest[tidx].second;
for (auto op : optotest) {
- Bexpression *bright = be->var_expression(bv, VE_rvalue, loc);
+ Bexpression *bright = be->var_expression(bv, loc);
Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
Bstatement *es = be->expression_statement(func, cmp);
h.addStmt(es);
@@ -707,7 +707,7 @@
Bexpression *bleft = valtotest[tidx].first;
Bvariable *bv = valtotest[tidx].second;
for (auto op : optotest) {
- Bexpression *bright = be->var_expression(bv, VE_rvalue, loc);
+ Bexpression *bright = be->var_expression(bv, loc);
Bexpression *cmp = be->binary_expression(op, bleft, bright, loc);
Bstatement *es = be->expression_statement(func, cmp);
h.addStmt(es);
@@ -747,12 +747,12 @@
// x = y + z + w
Location loc;
- Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
- Bexpression *vez = be->var_expression(z, VE_rvalue, loc);
- Bexpression *vew = be->var_expression(w, VE_rvalue, loc);
+ Bexpression *vey = be->var_expression(y, loc);
+ Bexpression *vez = be->var_expression(z, loc);
+ Bexpression *vew = be->var_expression(w, loc);
Bexpression *ypz = be->binary_expression(OPERATOR_PLUS, vey, vez, loc);
Bexpression *ypzpw = be->binary_expression(OPERATOR_PLUS, ypz, vew, loc);
- Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
+ Bexpression *vex = be->var_expression(x, loc);
h.mkAssign(vex, ypzpw);
const char *exp = R"RAW_RESULT(
@@ -802,8 +802,8 @@
Bvariable *bvl = valtotest[tidx].first;
Bvariable *bvr = valtotest[tidx].second;
for (auto op : optotest) {
- Bexpression *bleft = be->var_expression(bvl, VE_rvalue, loc);
- Bexpression *bright = be->var_expression(bvr, VE_rvalue, loc);
+ Bexpression *bleft = be->var_expression(bvl, loc);
+ Bexpression *bright = be->var_expression(bvr, loc);
Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
Bstatement *es = be->expression_statement(func, cmp);
h.addStmt(es);
@@ -908,7 +908,7 @@
for (auto op : optotest) {
if (op == OPERATOR_MOD && bleft->btype()->type()->isFloatingPointTy())
continue;
- Bexpression *bright = be->var_expression(bv, VE_rvalue, loc);
+ Bexpression *bright = be->var_expression(bv, loc);
Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
Bstatement *es = be->expression_statement(func, cmp);
h.addStmt(es);
@@ -967,8 +967,8 @@
Bvariable *bvl = valtotest[tidx].first;
Bvariable *bvr = valtotest[tidx].second;
for (auto op : optotest) {
- Bexpression *bleft = be->var_expression(bvl, VE_rvalue, loc);
- Bexpression *bright = be->var_expression(bvr, VE_rvalue, loc);
+ Bexpression *bleft = be->var_expression(bvl, loc);
+ Bexpression *bright = be->var_expression(bvr, loc);
Bexpression *cmp = be->binary_expression(op, bleft, bright, Location());
Bstatement *es = be->expression_statement(func, cmp);
h.addStmt(es);
@@ -978,16 +978,16 @@
// Verify correct behavior when type of shift amount does not match
// type of shift value.
{
- Bexpression *bleft = be->var_expression(x, VE_rvalue, loc);
- Bexpression *bright = be->var_expression(z, VE_rvalue, loc);
+ Bexpression *bleft = be->var_expression(x, loc);
+ Bexpression *bright = be->var_expression(z, loc);
Bexpression *mix = be->binary_expression(OPERATOR_LSHIFT, bleft, bright,
Location());
Bstatement *es = be->expression_statement(func, mix);
h.addStmt(es);
}
{
- Bexpression *bleft = be->var_expression(z, VE_rvalue, loc);
- Bexpression *bright = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *bleft = be->var_expression(z, loc);
+ Bexpression *bright = be->var_expression(y, loc);
Bexpression *mix = be->binary_expression(OPERATOR_RSHIFT, bleft, bright,
Location());
Bstatement *es = be->expression_statement(func, mix);
@@ -1048,11 +1048,11 @@
Bvariable *b = h.mkLocal("b", bt);
for (auto op : optotest) {
- Bexpression *bleft = be->var_expression(x, VE_rvalue, loc);
- Bexpression *bright = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *bleft = be->var_expression(x, loc);
+ Bexpression *bright = be->var_expression(y, loc);
Bexpression *bop = be->binary_expression(op, bleft, bright, Location());
Bexpression *bvex = be->var_expression(op == OPERATOR_EQEQ || op == OPERATOR_NOTEQ ? b : z,
- VE_lvalue, loc);
+ loc);
h.mkAssign(bvex, bop);
}
@@ -1232,21 +1232,21 @@
Bvariable *x = h.mkLocal("x", bc128t);
// a = real(x)
- Bexpression *avex1 = be->var_expression(a, VE_lvalue, loc);
- Bexpression *xvex1 = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *avex1 = be->var_expression(a, loc);
+ Bexpression *xvex1 = be->var_expression(x, loc);
Bexpression *realex = be->real_part_expression(xvex1, loc);
h.mkAssign(avex1, realex);
// b = imag(x)
- Bexpression *bvex2 = be->var_expression(b, VE_lvalue, loc);
- Bexpression *xvex2 = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *bvex2 = be->var_expression(b, loc);
+ Bexpression *xvex2 = be->var_expression(x, loc);
Bexpression *imagex = be->imag_part_expression(xvex2, loc);
h.mkAssign(bvex2, imagex);
// x = complex(b, a)
- Bexpression *xvex3 = be->var_expression(x, VE_lvalue, loc);
- Bexpression *bvex3 = be->var_expression(b, VE_rvalue, loc);
- Bexpression *avex3 = be->var_expression(a, VE_rvalue, loc);
+ Bexpression *xvex3 = be->var_expression(x, loc);
+ Bexpression *bvex3 = be->var_expression(b, loc);
+ Bexpression *avex3 = be->var_expression(a, loc);
Bexpression *compex = be->complex_expression(bvex3, avex3, loc);
h.mkAssign(xvex3, compex);
@@ -1320,8 +1320,8 @@
// Two calls, no type
Bexpression *call1 = h.mkCallExpr(be, func, nullptr);
Bexpression *call2 = h.mkCallExpr(be, func, nullptr);
- Bexpression *vex1 = be->var_expression(pv1, VE_rvalue, loc);
- Bexpression *vex2 = be->var_expression(pv2, VE_rvalue, loc);
+ Bexpression *vex1 = be->var_expression(pv1, loc);
+ Bexpression *vex2 = be->var_expression(pv2, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_LT, vex1, vex2, loc);
Bexpression *condex = be->conditional_expression(func, nullptr, cmp, call1,
call2, loc);
@@ -1375,7 +1375,7 @@
// Call on true branch,
Bexpression *call1 = h.mkCallExpr(be, func, nullptr);
- Bexpression *ve = be->var_expression(pv1, VE_rvalue, loc);
+ Bexpression *ve = be->var_expression(pv1, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_LT,
mkInt64Const(be, int64_t(3)),
mkInt64Const(be, int64_t(4)), loc);
@@ -1428,10 +1428,10 @@
// Local var with conditional expression as init
Bvariable *p0v = func->getNthParamVar(0);
Bvariable *p1v = func->getNthParamVar(1);
- Bexpression *vep1 = be->var_expression(p1v, VE_rvalue, loc);
+ Bexpression *vep1 = be->var_expression(p1v, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_LT, vep1,
mkInt32Const(be, int32_t(7)), loc);
- Bexpression *vep0 = be->var_expression(p0v, VE_rvalue, loc);
+ Bexpression *vep0 = be->var_expression(p0v, loc);
Bexpression *bzero = be->zero_expression(s2t);
Bexpression *cond = be->conditional_expression(func, s2t, cmp,
@@ -1491,10 +1491,10 @@
// x
Btype *bi64t = be->integer_type(false, 64);
Bvariable *xv = h.mkLocal("x", bi64t);
- Bexpression *vex = be->var_expression(xv, VE_lvalue, loc);
+ Bexpression *vex = be->var_expression(xv, loc);
Bstatement *st = be->assignment_statement(func, vex,
mkInt64Const(be, 5), loc);
- Bexpression *vex2 = be->var_expression(xv, VE_rvalue, loc);
+ Bexpression *vex2 = be->var_expression(xv, loc);
Bexpression *ce = be->compound_expression(st, vex2, loc);
Bstatement *es = be->expression_statement(func, ce);
h.addStmt(es);
@@ -1539,11 +1539,11 @@
// *(p0 == nil ? p1 : p0) = 7
Bvariable *p0v = func->getNthParamVar(0);
Bvariable *p1v = func->getNthParamVar(1);
- Bexpression *vex = be->var_expression(p0v, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(p0v, loc);
Bexpression *npe = be->nil_pointer_expression();
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, vex, npe, loc);
- Bexpression *ver0 = be->var_expression(p0v, VE_rvalue, loc);
- Bexpression *ver1 = be->var_expression(p1v, VE_rvalue, loc);
+ Bexpression *ver0 = be->var_expression(p0v, loc);
+ Bexpression *ver1 = be->var_expression(p1v, loc);
Bexpression *guard =
be->conditional_expression(func, be->pointer_type(bi32t), cmp,
ver1, ver0, loc);
@@ -1599,28 +1599,28 @@
// var y bool = !x
Btype *bt = be->bool_type();
Bvariable *xv = h.mkLocal("x", bt);
- Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(xv, loc);
h.mkLocal("y", bt, be->unary_expression(OPERATOR_NOT, vex, loc));
// var a i32
// var b i32 = -a
Btype *bi32t = be->integer_type(false, 32);
Bvariable *av = h.mkLocal("a", bi32t);
- Bexpression *vea = be->var_expression(av, VE_rvalue, loc);
+ Bexpression *vea = be->var_expression(av, loc);
h.mkLocal("b", bi32t, be->unary_expression(OPERATOR_MINUS, vea, loc));
// var z i64
// var w i64 = ^z
Btype *bi64t = be->integer_type(false, 64);
Bvariable *zv = h.mkLocal("z", bi64t);
- Bexpression *vez = be->var_expression(zv, VE_rvalue, loc);
+ Bexpression *vez = be->var_expression(zv, loc);
h.mkLocal("w", bi64t, be->unary_expression(OPERATOR_XOR, vez, loc));
// var q float64
// var r float64 = -z
Btype *bf64t = be->float_type(64);
Bvariable *qv = h.mkLocal("q", bf64t);
- Bexpression *veq = be->var_expression(qv, VE_rvalue, loc);
+ Bexpression *veq = be->var_expression(qv, loc);
h.mkLocal("r", bf64t, be->unary_expression(OPERATOR_MINUS, veq, loc));
const char *exp = R"RAW_RESULT(
diff --git a/unittests/BackendCore/BackendFcnTests.cpp b/unittests/BackendCore/BackendFcnTests.cpp
index eea8558..c998e46 100644
--- a/unittests/BackendCore/BackendFcnTests.cpp
+++ b/unittests/BackendCore/BackendFcnTests.cpp
@@ -275,7 +275,7 @@
// __builtin_ctzll(x);
Bfunction *bfcn = be->lookup_builtin("__builtin_ctzll");
//Bexpression *fnexpr = be->function_code_expression(bfcn, loc);
- Bexpression *ve = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *ve = be->var_expression(x, loc);
Bexpression *call = h.mkCallExpr(be, bfcn, ve, nullptr);
h.mkExprStmt(call);
@@ -307,8 +307,8 @@
// memcmp(&x,&y,sizeof(x))
{
Bfunction *bmemcmp = be->lookup_builtin("memcmp");
- Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
- Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(x, loc);
+ Bexpression *vey = be->var_expression(y, loc);
Bexpression *call =
h.mkCallExpr(be, bmemcmp,
be->address_expression(vex, loc),
@@ -321,8 +321,8 @@
// memmove(&x,&y,sizeof(x))
{
Bfunction *bmemmove = be->lookup_builtin("memmove");
- Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
- Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(x, loc);
+ Bexpression *vey = be->var_expression(y, loc);
Bexpression *call =
h.mkCallExpr(be, bmemmove,
be->address_expression(vex, loc),
@@ -335,8 +335,8 @@
// memcpy(&y,&x,sizeof(y))
{
Bfunction *bmemcpy = be->lookup_builtin("memcpy");
- Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
- Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *vey = be->var_expression(y, loc);
+ Bexpression *vex = be->var_expression(x, loc);
Bexpression *call =
h.mkCallExpr(be, bmemcpy,
be->address_expression(vey, loc),
diff --git a/unittests/BackendCore/BackendNodeTests.cpp b/unittests/BackendCore/BackendNodeTests.cpp
index b59a121..3db4e7e 100644
--- a/unittests/BackendCore/BackendNodeTests.cpp
+++ b/unittests/BackendCore/BackendNodeTests.cpp
@@ -70,9 +70,9 @@
Bexpression *c22 = mkInt32Const(be, 22);
Bvariable *xv = h.mkLocal("x", bi32t);
Bvariable *yv = h.mkLocal("y", bpi32t);
- Bexpression *ve = be->var_expression(xv, VE_rvalue, loc);
+ Bexpression *ve = be->var_expression(xv, loc);
Bexpression *add = be->binary_expression(OPERATOR_PLUS, c22, ve, loc);
- Bexpression *ve2 = be->var_expression(yv, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(yv, loc);
Bexpression *der = be->indirect_expression(bi32t, ve2, false, loc);
Bexpression *sub = be->binary_expression(OPERATOR_MINUS, add, der, loc);
Bexpression *matsub = be->materialize(sub);
@@ -141,11 +141,11 @@
Bvariable *xv = h.mkLocal("x", bi32t);
Bvariable *yv = h.mkLocal("y", bpi32t);
Bvariable *zv = h.mkLocal("z", bi16t);
- Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
- Bexpression *vez = be->var_expression(zv, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(xv, loc);
+ Bexpression *vez = be->var_expression(zv, loc);
Bexpression *conv = be->convert_expression(bi32t, vez, loc);
Bexpression *sub = be->binary_expression(OPERATOR_PLUS, vex, conv, loc);
- Bexpression *vey = be->var_expression(yv, VE_rvalue, loc);
+ Bexpression *vey = be->var_expression(yv, loc);
Bexpression *der = be->indirect_expression(bi32t, vey, false, loc);
Bexpression *add = be->binary_expression(OPERATOR_PLUS, sub, der, loc);
Bexpression *matadd = be->materialize(add);
@@ -188,7 +188,7 @@
Bvariable *xv = h.mkLocal("x", s4t);
// y = x.f1.f1 + x.f1.f1 [with sharing]
- Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(xv, loc);
Bexpression *f1ex = be->struct_field_expression(vex, 0, loc);
Bexpression *f2ex = be->struct_field_expression(f1ex, 0, loc);
Bexpression *der = be->indirect_expression(bi32t, f2ex, false, loc);
diff --git a/unittests/BackendCore/BackendPointerExprTests.cpp b/unittests/BackendCore/BackendPointerExprTests.cpp
index c3c504b..292012d 100644
--- a/unittests/BackendCore/BackendPointerExprTests.cpp
+++ b/unittests/BackendCore/BackendPointerExprTests.cpp
@@ -34,8 +34,8 @@
{
// x = &y
- Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
- Bexpression *vey = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(x, loc);
+ Bexpression *vey = be->var_expression(y, loc);
Bexpression *ady = be->address_expression(vey, loc);
Bstatement *as = be->assignment_statement(func, vex, ady, loc);
h.addStmt(as);
@@ -43,8 +43,8 @@
{
// y = *x
- Bexpression *vey = be->var_expression(y, VE_lvalue, loc);
- Bexpression *vex = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *vey = be->var_expression(y, loc);
+ Bexpression *vex = be->var_expression(x, loc);
bool knValid = false;
Bexpression *indx1 = be->indirect_expression(bi64t, vex, knValid, loc);
Bstatement *as = be->assignment_statement(func, vey, indx1, loc);
@@ -53,7 +53,7 @@
{
// *x = 3
- Bexpression *vex = be->var_expression(x, VE_lvalue, loc);
+ Bexpression *vex = be->var_expression(x, loc);
Bexpression *indx = be->indirect_expression(bi64t, vex, false, loc);
Bexpression *beic3 = mkInt64Const(be, 3);
Bstatement *as = be->assignment_statement(func, indx, beic3, loc);
@@ -103,7 +103,7 @@
// Pointer-to-FD variables
Btype *pfd1t = be->pointer_type(fdesct1);
Btype *pfd2t = be->pointer_type(fdesct2);
- Bexpression *vex1 = be->var_expression(bfdv1, VE_rvalue, loc);
+ Bexpression *vex1 = be->var_expression(bfdv1, loc);
Bexpression *adfd1 = be->address_expression(vex1, loc);
Bvariable *bfpv1 = h.mkLocal("fploc1", pfd1t, adfd1);
Bvariable *bfpv2 = h.mkLocal("fploc2", pfd2t);
@@ -111,11 +111,11 @@
// Assignment of function descriptor pointer values. Note that the
// types here are not going to agree strictly; this test verifies
// that this flexibility is allowed.
- Bexpression *vex2 = be->var_expression(bfpv2, VE_lvalue, loc);
- Bexpression *rvex2 = be->var_expression(bfpv1, VE_rvalue, loc);
+ Bexpression *vex2 = be->var_expression(bfpv2, loc);
+ Bexpression *rvex2 = be->var_expression(bfpv1, loc);
h.mkAssign(vex2, rvex2);
- Bexpression *vex3 = be->var_expression(bfpv1, VE_lvalue, loc);
- Bexpression *rvex3 = be->var_expression(bfpv2, VE_rvalue, loc);
+ Bexpression *vex3 = be->var_expression(bfpv1, loc);
+ Bexpression *rvex3 = be->var_expression(bfpv2, loc);
h.mkAssign(vex3, rvex3);
const char *exp = R"RAW_RESULT(
@@ -161,8 +161,8 @@
{
// b1 = (pb1 == nil)
- Bexpression *vel = be->var_expression(b1, VE_lvalue, loc);
- Bexpression *ver = be->var_expression(pb1, VE_rvalue, loc);
+ Bexpression *vel = be->var_expression(b1, loc);
+ Bexpression *ver = be->var_expression(pb1, loc);
Bexpression *npe = be->nil_pointer_expression();
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ver, npe, loc);
h.mkAssign(vel, cmp);
@@ -170,8 +170,8 @@
{
// b1 = (nil == pb1)
- Bexpression *vel = be->var_expression(b1, VE_lvalue, loc);
- Bexpression *ver = be->var_expression(pb1, VE_rvalue, loc);
+ Bexpression *vel = be->var_expression(b1, loc);
+ Bexpression *ver = be->var_expression(pb1, loc);
Bexpression *npe = be->nil_pointer_expression();
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, npe, ver, loc);
h.mkAssign(vel, cmp);
@@ -258,16 +258,16 @@
{
// cpv1 = &cpv2
- Bexpression *ve1 = be->var_expression(cpv1, VE_lvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(cpv1, loc);
+ Bexpression *ve2 = be->var_expression(cpv2, loc);
Bexpression *adx = be->address_expression(ve2, loc);
h.mkAssign(ve1, adx);
}
{
// cpv2 = &cpv1
- Bexpression *ve1 = be->var_expression(cpv2, VE_lvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(cpv2, loc);
+ Bexpression *ve2 = be->var_expression(cpv1, loc);
Bexpression *adx = be->address_expression(ve2, loc);
h.mkAssign(ve1, adx);
}
@@ -279,9 +279,9 @@
{
// b1 := (cpv1 == *cpv2)
- Bexpression *ve0 = be->var_expression(b1, VE_lvalue, loc);
- Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+ Bexpression *ve0 = be->var_expression(b1, loc);
+ Bexpression *ve1 = be->var_expression(cpv1, loc);
+ Bexpression *ve2 = be->var_expression(cpv2, loc);
Bexpression *dex = be->indirect_expression(pht, ve2, false, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ve1, dex, loc);
h.mkAssign(ve0, cmp);
@@ -289,19 +289,19 @@
{
// b2 := (&cpv1 != cpv2)
- Bexpression *ve0 = be->var_expression(b2, VE_lvalue, loc);
- Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
+ Bexpression *ve0 = be->var_expression(b2, loc);
+ Bexpression *ve1 = be->var_expression(cpv1, loc);
Bexpression *adx = be->address_expression(ve1, loc);
- Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(cpv2, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, adx, ve2, loc);
h.mkAssign(ve0, cmp);
}
{
// b3 := (cpv1 == ***cpv2)
- Bexpression *ve0 = be->var_expression(b3, VE_lvalue, loc);
- Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+ Bexpression *ve0 = be->var_expression(b3, loc);
+ Bexpression *ve1 = be->var_expression(cpv1, loc);
+ Bexpression *ve2 = be->var_expression(cpv2, loc);
Bexpression *dex1 = be->indirect_expression(pht, ve2, false, loc);
Bexpression *dex2 = be->indirect_expression(pht, dex1, false, loc);
Bexpression *dex3 = be->indirect_expression(pht, dex2, false, loc);
@@ -382,16 +382,16 @@
{
// x = &y
- Bexpression *ve1 = be->var_expression(cpv1, VE_lvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(cpv1, loc);
+ Bexpression *ve2 = be->var_expression(cpv2, loc);
Bexpression *adx = be->address_expression(ve2, loc);
h.mkAssign(ve1, adx);
}
{
// y = &x
- Bexpression *ve1 = be->var_expression(cpv2, VE_lvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(cpv2, loc);
+ Bexpression *ve2 = be->var_expression(cpv1, loc);
Bexpression *adx = be->address_expression(ve2, loc);
h.mkAssign(ve1, adx);
}
@@ -401,9 +401,9 @@
{
// b1 := (x == *y)
- Bexpression *ve0 = be->var_expression(b1, VE_lvalue, loc);
- Bexpression *ve1 = be->var_expression(cpv1, VE_rvalue, loc);
- Bexpression *ve2 = be->var_expression(cpv2, VE_rvalue, loc);
+ Bexpression *ve0 = be->var_expression(b1, loc);
+ Bexpression *ve1 = be->var_expression(cpv1, loc);
+ Bexpression *ve2 = be->var_expression(cpv2, loc);
Bexpression *dex = be->indirect_expression(pht1, ve2, false, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_EQEQ, ve1, dex, loc);
h.mkAssign(ve0, cmp);
@@ -444,7 +444,7 @@
{
// deref(ptr_offset(p3, 5)) = 9
- Bexpression *ve = be->var_expression(p3, VE_lvalue, loc);
+ Bexpression *ve = be->var_expression(p3, loc);
Bexpression *cfive = mkInt32Const(be, 5);
Bexpression *poe1 = be->pointer_offset_expression(ve, cfive, loc);
Bexpression *der = be->indirect_expression(bi64t, poe1, false, loc);
@@ -455,8 +455,8 @@
{
// p0 = int32(deref(ptr_offset(p3, 7)))
Btype *bi32t = be->integer_type(false, 32);
- Bexpression *ve = be->var_expression(p0, VE_lvalue, loc);
- Bexpression *ver = be->var_expression(p3, VE_rvalue, loc);
+ Bexpression *ve = be->var_expression(p0, loc);
+ Bexpression *ver = be->var_expression(p3, loc);
Bexpression *cseven = mkInt32Const(be, 7);
Bexpression *poe2 = be->pointer_offset_expression(ver, cseven, loc);
Bexpression *der = be->indirect_expression(bi64t, poe2, false, loc);
@@ -494,13 +494,13 @@
Bvariable *xv = h.mkLocal("x", bi64t);
// p3 = addr(deref(addr(deref(addr(x))))))
- Bexpression *vexr = be->var_expression(xv, VE_rvalue, loc);
+ Bexpression *vexr = be->var_expression(xv, loc);
Bexpression *ad1 = be->address_expression(vexr, loc);
Bexpression *der1 = be->indirect_expression(bi64t, ad1, false, loc);
Bexpression *ad2 = be->address_expression(der1, loc);
Bexpression *der2 = be->indirect_expression(bi64t, ad2, false, loc);
Bexpression *ad3 = be->address_expression(der2, loc);
- Bexpression *vexl = be->var_expression(p3, VE_lvalue, loc);
+ Bexpression *vexl = be->var_expression(p3, loc);
h.mkAssign(vexl, ad3);
const char *exp = R"RAW_RESULT(
diff --git a/unittests/BackendCore/BackendStmtTests.cpp b/unittests/BackendCore/BackendStmtTests.cpp
index dc2ebe5..9e55ef8 100644
--- a/unittests/BackendCore/BackendStmtTests.cpp
+++ b/unittests/BackendCore/BackendStmtTests.cpp
@@ -54,7 +54,7 @@
// assign a constant to a variable
Bvariable *loc1 = h.mkLocal("loc1", bi64t);
- Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, loc);
+ Bexpression *ve1 = be->var_expression(loc1, loc);
Bstatement *as =
be->assignment_statement(func, ve1, mkInt64Const(be, 123), loc);
ASSERT_TRUE(as != nullptr);
@@ -62,8 +62,8 @@
// assign a variable to a variable
Bvariable *loc2 = h.mkLocal("loc2", bi64t);
- Bexpression *ve2 = be->var_expression(loc2, VE_lvalue, loc);
- Bexpression *ve3 = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(loc2, loc);
+ Bexpression *ve3 = be->var_expression(loc1, loc);
Bstatement *as2 = be->assignment_statement(func, ve2, ve3, loc);
ASSERT_TRUE(as2 != nullptr);
h.addStmt(as2);
@@ -80,7 +80,7 @@
// error handling
Bvariable *loc3 = h.mkLocal("loc3", bi64t);
- Bexpression *ve4 = be->var_expression(loc3, VE_lvalue, loc);
+ Bexpression *ve4 = be->var_expression(loc3, loc);
Bstatement *badas =
be->assignment_statement(func, ve4, be->error_expression(), loc);
ASSERT_TRUE(badas != nullptr);
@@ -101,7 +101,7 @@
// return loc1
Location loc;
- Bexpression *ve1 = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(loc1, loc);
Bstatement *ret = h.mkReturn(ve1);
const char *exp = R"RAW_RESULT(
@@ -136,12 +136,12 @@
Bvariable *x = h.mkLocal("x", bi64t, mkInt64Const(be, 10));
// return x
- Bexpression *ve1 = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(x, loc);
h.mkReturn(ve1);
// some dead code
// return x+20
- Bexpression *ve2 = be->var_expression(x, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(x, loc);
Bexpression *addexpr = be->binary_expression(OPERATOR_PLUS, ve2, mkInt64Const(be, 20), loc);
h.mkReturn(addexpr);
@@ -185,7 +185,7 @@
h.addStmt(gots);
// dead stmt: loc1 = 11
- h.mkAssign(be->var_expression(loc1, VE_lvalue, loc),
+ h.mkAssign(be->var_expression(loc1, loc),
mkInt64Const(be, 11));
// labeldef
@@ -221,7 +221,7 @@
// Now define the label, throw a statement in it.
Bstatement *ldef = be->label_definition_statement(lab1);
h.addStmt(ldef);
- h.mkAssign(be->var_expression(loc1, VE_lvalue, h.loc()),
+ h.mkAssign(be->var_expression(loc1, h.loc()),
be->zero_expression(bu8t));
bool broken = h.finish(StripDebugInfo);
@@ -253,12 +253,12 @@
Bvariable *loc1 = h.mkLocal("loc1", bi64t);
// loc1 = 123
- Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, loc);
+ Bexpression *ve1 = be->var_expression(loc1, loc);
Bexpression *c123 = mkInt64Const(be, 123);
Bstatement *as1 = be->assignment_statement(func, ve1, c123, loc);
// loc1 = 987
- Bexpression *ve2 = be->var_expression(loc1, VE_lvalue, loc);
+ Bexpression *ve2 = be->var_expression(loc1, loc);
Bexpression *c987 = mkInt64Const(be, 987);
Bstatement *as2 = be->assignment_statement(func, ve2, c987, loc);
@@ -283,7 +283,7 @@
// loc2 = 456
Btype *bi64t = be->integer_type(false, 64);
Bvariable *loc2 = h.mkLocal("loc2", bi64t);
- Bexpression *ve3 = be->var_expression(loc2, VE_lvalue, loc);
+ Bexpression *ve3 = be->var_expression(loc2, loc);
Bexpression *c456 = mkInt64Const(be, 456);
Bstatement *as3 = be->assignment_statement(func, ve3, c456, loc);
@@ -348,8 +348,8 @@
// first case
// loc1 = loc1 / 123
- Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, loc);
- Bexpression *ve1r = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(loc1, loc);
+ Bexpression *ve1r = be->var_expression(loc1, loc);
Bexpression *c123 = mkInt64Const(be, 123);
Bexpression *div = be->binary_expression(OPERATOR_DIV, ve1r, c123, loc);
Bstatement *as1 = be->assignment_statement(func, ve1, div, loc);
@@ -358,10 +358,10 @@
// second case
// loc1 = loc1 < 987 ? loc1 : 987 * loc1
- Bexpression *ve2 = be->var_expression(loc1, VE_lvalue, loc);
- Bexpression *ve2r = be->var_expression(loc1, VE_rvalue, loc);
- Bexpression *ve2r2 = be->var_expression(loc1, VE_rvalue, loc);
- Bexpression *ve2r3 = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(loc1, loc);
+ Bexpression *ve2r = be->var_expression(loc1, loc);
+ Bexpression *ve2r2 = be->var_expression(loc1, loc);
+ Bexpression *ve2r3 = be->var_expression(loc1, loc);
Bexpression *c987 = mkInt64Const(be, 987);
Bexpression *mul = be->binary_expression(OPERATOR_MULT, c987, ve2r, loc);
Bexpression *cmp = be->binary_expression(OPERATOR_LE, ve2r2, c987, loc);
@@ -375,7 +375,7 @@
// fourth case
// loc1 = 456
- Bexpression *ve4 = be->var_expression(loc1, VE_lvalue, loc);
+ Bexpression *ve4 = be->var_expression(loc1, loc);
Bexpression *c456 = mkInt64Const(be, 456);
Bstatement *as4 = be->assignment_statement(func, ve4, c456, loc);
Bstatement *goto4 = be->goto_statement(brklab, loc);
@@ -391,7 +391,7 @@
cases.push_back(std::vector<Bexpression*>()); // default
// switch
- Bexpression *vesw = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *vesw = be->var_expression(loc1, loc);
h.mkSwitch(vesw, cases, statements);
// label definition
@@ -525,7 +525,7 @@
// Materialize call to deferreturn
Bexpression *retfn = be->function_code_expression(bdefretfcn, h.newloc());
std::vector<Bexpression *> args1;
- Bexpression *ve1 = be->var_expression(loc1, VE_rvalue, h.newloc());
+ Bexpression *ve1 = be->var_expression(loc1, h.newloc());
Bexpression *adve1 = be->address_expression(ve1, h.newloc());
args1.push_back(adve1);
Bexpression *undcall = be->call_expression(func, retfn, args1,
@@ -534,7 +534,7 @@
// Materialize call to checkdefer
Bexpression *ckfn = be->function_code_expression(bchkfcn, h.newloc());
std::vector<Bexpression *> args2;
- Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, h.loc());
+ Bexpression *ve2 = be->var_expression(loc1, h.loc());
Bexpression *adve2 = be->address_expression(ve2, h.loc());
args2.push_back(adve2);
Bexpression *ckdefcall = be->call_expression(func, ckfn, args2,
@@ -630,12 +630,12 @@
// x = id(99)
// plark()
// x = 123
- Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, h.newloc());
+ Bexpression *ve1 = be->var_expression(loc1, h.newloc());
Bstatement *as1 =
be->assignment_statement(func, ve1, calls[3], h.newloc());
Bblock *bb1 = mkBlockFromStmt(be, func, as1);
addStmtToBlock(be, bb1, h.mkExprStmt(calls[0], FcnTestHarness::NoAppend));
- Bexpression *ve2 = be->var_expression(loc1, VE_lvalue, h.newloc());
+ Bexpression *ve2 = be->var_expression(loc1, h.newloc());
Bstatement *as2 =
be->assignment_statement(func, ve2, mkInt64Const(be, 123), h.newloc());
addStmtToBlock(be, bb1, as2);
@@ -726,12 +726,12 @@
{
// Store value to tmp
Location loc;
- Bexpression *ve = be->var_expression(rtmp, VE_lvalue, loc);
+ Bexpression *ve = be->var_expression(rtmp, loc);
Bstatement *as = be->assignment_statement(func, ve, val, loc);
Bblock *block = mkBlockFromStmt(be, func, as);
// Load from temp and return
- Bexpression *ve2 = be->var_expression(rtmp, VE_rvalue, loc);
+ Bexpression *ve2 = be->var_expression(rtmp, loc);
std::vector<Bexpression *> vals;
vals.push_back(ve2);
Bstatement *rst = be->return_statement(func, vals, loc);
@@ -775,7 +775,7 @@
mkInt64Const(be, 88),
h.loc());
Bvariable *p0 = func->getNthParamVar(0);
- Bexpression *ve1 = be->var_expression(p0, VE_rvalue, h.newloc());
+ Bexpression *ve1 = be->var_expression(p0, h.newloc());
Bstatement *retparm = mkMemReturn(be, func, rtmp, ve1);
Bstatement *ret22 = mkMemReturn(be, func, rtmp, mkInt64Const(be, 22));
diff --git a/unittests/BackendCore/BackendTreeIntegrity.cpp b/unittests/BackendCore/BackendTreeIntegrity.cpp
index c0fa2dc..a03dc2b 100644
--- a/unittests/BackendCore/BackendTreeIntegrity.cpp
+++ b/unittests/BackendCore/BackendTreeIntegrity.cpp
@@ -28,7 +28,7 @@
// Create "2 + x"
Btype *bi64t = be->integer_type(false, 64);
Bvariable *xv = h.mkLocal("x", bi64t);
- Bexpression *vex = be->var_expression(xv, VE_rvalue, loc);
+ Bexpression *vex = be->var_expression(xv, loc);
Bexpression *bl1 = mkInt64Const(be, 2);
Bexpression *badd1 = be->binary_expression(OPERATOR_PLUS, bl1, vex, loc);
Bstatement *es = be->expression_statement(func, badd1);
@@ -75,7 +75,7 @@
Bvariable *loc2 = be->local_variable(func, "loc2", bi64t, true, loc);
// Create "loc1" varexpr, then supply to more than one statement
- Bexpression *ve = be->var_expression(loc1, VE_rvalue, loc);
+ Bexpression *ve = be->var_expression(loc1, loc);
Bstatement *es1 = be->expression_statement(func, ve);
Bblock *block = mkBlockFromStmt(be.get(), func, es1);
Bstatement *es2 = be->expression_statement(func, ve);
@@ -89,7 +89,7 @@
be->nodeBuilder().destroy(block, DelBoth);
- Bexpression *ve3 = be->var_expression(loc2, VE_rvalue, loc);
+ Bexpression *ve3 = be->var_expression(loc2, loc);
Bstatement *es3 = be->expression_statement(func, ve3);
Bblock *block2 = mkBlockFromStmt(be.get(), func, es3);
diff --git a/unittests/BackendCore/BackendVarTests.cpp b/unittests/BackendCore/BackendVarTests.cpp
index fee4cf7..f94e7ed 100644
--- a/unittests/BackendCore/BackendVarTests.cpp
+++ b/unittests/BackendCore/BackendVarTests.cpp
@@ -47,12 +47,12 @@
EXPECT_TRUE(loc1 != loc2 && loc1->value() != loc2->value());
// Test var_expression created from local variable
- Bexpression *ve1 = be->var_expression(loc1, VE_lvalue, Location());
+ Bexpression *ve1 = be->var_expression(loc1, Location());
ASSERT_TRUE(ve1 != nullptr);
EXPECT_EQ(ve1->value(), loc1->value());
// Test var_expression created from local variable
- Bexpression *ve2 = be->var_expression(loc1, VE_rvalue, Location());
+ Bexpression *ve2 = be->var_expression(loc1, Location());
ASSERT_TRUE(ve2 != nullptr);
Bstatement *es = h.mkExprStmt(ve2);
EXPECT_EQ(repr(ve2->value()), "%loc1 = alloca i64");
@@ -88,7 +88,7 @@
EXPECT_TRUE(isa<AllocaInst>(p2->value()));
// Test var_expression created from param variable
- Bexpression *ve1 = be->var_expression(p1, VE_lvalue, Location());
+ Bexpression *ve1 = be->var_expression(p1, Location());
ASSERT_TRUE(ve1 != nullptr);
EXPECT_EQ(ve1->value(), p1->value());
@@ -120,7 +120,7 @@
be->global_variable_set_init(g1, mkInt32Const(be.get(), 101));
// Test var_expression created from global variable
- Bexpression *ve1 = be->var_expression(g1, VE_lvalue, Location());
+ Bexpression *ve1 = be->var_expression(g1, Location());
ASSERT_TRUE(ve1 != nullptr);
EXPECT_EQ(ve1->value(), g1->value());
@@ -510,8 +510,8 @@
Bstatement *is2 = be->init_statement(func, y, be->zero_expression(bst));
// x := y.f1
- Bexpression *ve1 = be->var_expression(x, VE_lvalue, loc);
- Bexpression *ve2 = be->var_expression(y, VE_rvalue, loc);
+ Bexpression *ve1 = be->var_expression(x, loc);
+ Bexpression *ve2 = be->var_expression(y, loc);
Bexpression *fex = be->struct_field_expression(ve2, 1, loc);
Bstatement *as =
be->assignment_statement(func, ve1, fex, loc);
@@ -651,21 +651,21 @@
// some accesses to them.
// emptys2f.f1 = emptystruct
- Bexpression *vex1 = be->var_expression(gs2, VE_lvalue, loc);
+ Bexpression *vex1 = be->var_expression(gs2, loc);
Bexpression *fex1 = be->struct_field_expression(vex1, 0, loc);
- Bexpression *vex2 = be->var_expression(gs1, VE_rvalue, loc);
+ Bexpression *vex2 = be->var_expression(gs1, loc);
h.mkAssign(fex1, vex2);
// localemptys2f = emptys2f
Bvariable *loc1 = h.mkLocal("localemptys2f", bef2);
- Bexpression *vex3 = be->var_expression(loc1, VE_lvalue, loc);
- Bexpression *vex4 = be->var_expression(gs2, VE_rvalue, loc);
+ Bexpression *vex3 = be->var_expression(loc1, loc);
+ Bexpression *vex4 = be->var_expression(gs2, loc);
h.mkAssign(vex3, vex4);
// localemptyintar = emptyintar
Bvariable *loc2 = h.mkLocal("localemptyintar", atint0);
- Bexpression *vex5 = be->var_expression(loc2, VE_lvalue, loc);
- Bexpression *vex6 = be->var_expression(ga2, VE_rvalue, loc);
+ Bexpression *vex5 = be->var_expression(loc2, loc);
+ Bexpression *vex6 = be->var_expression(ga2, loc);
h.mkAssign(vex5, vex6);
bool broken = h.finish(StripDebugInfo);